2012-12-13 13 views
22

フォームからWeb APIアクションに情報を送信する方法を理解しようとしています。ここに私の見解はWeb APIにJSONオブジェクトを送信する

ある
<div id="part-sources"> 
    @foreach (SmallHorse.ProductSource source in Model.Sources) 
    { 
     @source.ItemNumber <br /> 
    } 
</div> 
<label>Part Number</label> 
<input type="text" id="part-number" name="part-number" /> 

<input type="submit" id="save-source" name="save-source" value="Add" /> 

ここ

var source = { 
     'ID': 0, 
     'ProductID': $('#ID').val(), 
     'PartNumber': $('#part-number').val(), 
     'VendorID': $('#Vendors').val() 
    } 

    $.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "/api/PartSourceAPI/", 
     data: JSON.stringify({ model: source }), 
     success: function (data) { 
      alert('success'); 
     }, 
     error: function (error) { 
      jsonValue = jQuery.parseJSON(error.responseText); 
      jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
     } 
    }); 

は私のモデルである

public class PartSourceModel 
{ 
    public int ID { get; set; } 
    public int ProductID { get; set; } 
    public int VendorID { get; set; } 
    public string PartNumber { get; set; } 
} 

ここに私のコントローラのアクションは

です:これは私が使用しようとしているjQueryの/ AJAXです
// POST api/partsourceapi 
public void Post(PartSourceModel model) 
{ 
    // currently no values are being passed into model param 
} 

私には何が欠けていますか?今、私がデバッグし、Ajaxリクエストがコントローラのアクションに当たったときにステップ実行すると、モデルのパラメータに何も渡されません。

+0

'JSON.stringify'を試したことがありますか? 'data:{model:source}'、あるいはおそらく 'data:source' - jQueryがあなたの変換を処理します... – nnnnnn

+0

はい、私はJSON.stringifyせずに試してみました。私はAJAX側で考えられるすべての可能な組み合わせを試しましたが、コントローラーに何かがないと思っています。私は分かりませんが、これはまったく推測です。 – Cory

+0

"nothing"がモデルのパラメータに渡されているとすると、インスタンス "model"がnullであることを意味しますか?または、その値のデフォルト/ヌルですか?モデルの型を文字列に変更して生の表現を取得するか、入力パラメータを削除してRequest.ContentとRequest.Headersのプロパティを直接調べて、サーバーが受け取っているものを見つけたらどうなりますか? – Snixtor

答えて

27

これを試してみてくださいする必要があります。

jqueryの

$('#save-source').click(function (e) { 
     e.preventDefault(); 
     var source = { 
      'ID': 0, 
      //'ProductID': $('#ID').val(), 
      'PartNumber': $('#part-number').val(), 
      //'VendorID': $('#Vendors').val() 
     } 
     $.ajax({ 
      type: "POST", 
      dataType: "json", 
      url: "/api/PartSourceAPI", 
      data: source, 
      success: function (data) { 
       alert(data); 
      }, 
      error: function (error) { 
       jsonValue = jQuery.parseJSON(error.responseText); 
       //jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
      } 
     }); 
    }); 

コントローラ

public string Post(PartSourceModel model) 
    { 
     return model.PartNumber; 
    } 

ビュー

<label>Part Number</label> 
<input type="text" id="part-number" name="part-number" /> 

<input type="submit" id="save-source" name="save-source" value="Add" /> 

今、あなたはあなたがテキストボックスに必要事項を記入した後、controllerはバックアラートでPartNumberボックスに書いたものを吐き出すだろう「Add」をクリックしたとき。

+1

ありがとうございます! 'data:source'を変更するだけで、コントローラ内の 'model'パラメータに正しくバインドされるようになりました。私はそれを動作させるために、私の名前に 'model:'という名前を私のajaxに含める必要があると思った。どうもありがとう! – Cory

+0

複雑なデータ形式の場合(デフォルトではデシリアライズできません)、サーバー側でjson文字列を受け取る必要があります。あなたは答えが単純なデータのために働くかもしれませんが、複雑なもののために働いていません(これは私がhahaを探しているものです)。あなたの答えは、この男の問題にも良いです! – Zwik

+0

私はajax呼び出しに 'contentType: 'application/json''を含めなければならないことがわかりました。なぜこの答えが必要なのでしょうか? –

-4

私はあなたがmodel引用符で囲む必要があると考えている:

JSON.stringify({ "model": source }) 
+2

オブジェクトリテラルでは、プロパティ名が数値リテラルまたは有効な識別子名である場合、プロパティ名を引用符で囲む必要はありません。だから '{model:source}'はうまくいきます。 – nnnnnn

+0

ブラウザのデバッガツールを使用して、リクエスト本体のアクションメソッドに何が送信されているかを確認しましたか? –

+0

Queti、はい私はFiddlerを使用していますが、要求に応じてコンテンツが送信されていないとは言えません。 – Cory

6

変更:

data: JSON.stringify({ model: source }) 

へ:

data: {model: JSON.stringify(source)} 

そして、あなたのコントローラでこれを行う:

public void PartSourceAPI(string model) 
{ 
     System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer(); 

    var result = js.Deserialize<PartSourceModel>(model); 
} 

あなたはjqueryのに使用するURLが/api/PartSourceAPIの場合、コントローラ名はapiでなければならず、アクション(メソッド)はPartSourceAPI

+0

私はこれを試してみましたが、残念なことに違いはありませんでした。 – Cory

+0

改訂版の回答を参照してください。 – Jeroen

3
var model = JSON.stringify({ 
    'ID': 0, 
    'ProductID': $('#ID').val(), 
    'PartNumber': $('#part-number').val(), 
    'VendorID': $('#Vendors').val() 
}) 

$.ajax({ 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json", 
    url: "/api/PartSourceAPI/", 
    data: model, 
    success: function (data) { 
     alert('success'); 
    }, 
    error: function (error) { 
     jsonValue = jQuery.parseJSON(error.responseText); 
     jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
    } 
}); 

var model = JSON.stringify({  'ID': 0,  ...': 5,  'PartNumber': 6,  'VendorID': 7 }) // output is "{"ID":0,"ProductID":5,"PartNumber":6,"VendorID":7}" 

データのようなものである "{" モデル ": "ID":0、" 商品コード ":6、" 製品型番 ":7、" ベンダーID ":8}}" ウェブAPIコントローラができませんあなたのモデルにバインドしてください

関連する問題