web-dev-qa-db-ja.com

JavaScriptオブジェクトをC#MVC 4コントローラーに渡す方法

MVC4では、JavaScriptオブジェクトをAJAXのC#コントローラーにどのように渡しますか?最後にこれを試しましたが、うまくいきませんでした。

Javascriptクライアント側:

    var myData = {Propr1: '', Propr2: ''};
    $.ajax({
        type: 'POST',
        data: JSON.stringify(myData),
        url: '/Home/SubmitMyData',
        contentType: 'application/json',
        dataType: 'json',
        success: alert('Youhou'),
        error: alert('not good')
    });

C#サーバー側の方法:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel
    {
        string Prop1 { get; set; }
        string Prop2 { get; set; }
    }

私のパラメーターは常にnullです。 contentTypeを変更しようとしましたが、まだ機能しません。私の間違いはどこですか?いくつかの投稿を見つけましたが、間違ったことは見つかりませんでした。

どうもありがとう。

11
Régis NIOX
  1. プロパティ名がJavaScriptとC#モデルで一致していることを確認してください。あなたの質問ではPropr1およびPropr2はjavascriptオブジェクトですが、C#モデルではProp1およびProp2(「r」がない)。
  2. 送信する前にデータをstringifyしないでください。また、dataTypejsonに設定しないでください。 MVCは、コードでjsonシリアル化を行わなくても、postパラメーターのコレクションを使用して問題なく解析できます。
  3. contentTypeを省略します。これは必要ありません。 WebAPIはこれを自動検出する必要があります。あなたはそれを残すことができますが、それは無関係です。
  4. モデルプロパティがパブリックであることを確認します。

Javascriptクライアント側:

    var myData = {Prop1: '', Prop2: ''}; // #1
    $.ajax({
        type: 'POST',
        data: myData, // #2
        url: '/Home/SubmitMyData',
        //contentType: 'application/json', #3
        //dataType: 'json', #2
        success: alert('Youhou'),
        error: alert('not good')
    });

C#サーバー側の方法:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel // #4
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
26
danludwig

dataプロパティに渡す値は、文字列ではなくオブジェクトである必要があります。

data: myData,

プロパティ名は一致する必要があります:

var myData = { Prop1: '', Prop2: ''};

パラメータ値で[FromBody]属性を使用する必要があります。

public ActionResult SubmitMyData([FromBody] MyParamModel myParam)

モデルタイプのプロパティはpublicである必要があります:

public class MyParamModel
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}
1
JLRishe