3

JSONデータ構造をMVC(3)コントローラーに渡し、JSONオブジェクトをすべてのプロパティがバインドされたC#オブジェクトに変換します。プロパティの1つは、単純なタイプです。それが基本的なモデルバインディングですよね?

これが私のモデルです:

public class Person
{
    public string Name { get; set; }
    public JobTitle JobTitle { get; set; }
}

public class JobTitle
{
    public string Title { get; set; }
    public bool IsSenior { get; set; }
}

これが私のIndex.cshtmlページです(「Person」クラスの構造に一致するJSONオブジェクトを渡してAJAXリクエストを作成します):

<div id="myDiv" style="border:1px solid #F00"></div>
<script type="text/javascript">
var person = { 
        Name: "Bob Smith",
        JobTitle: { 
            Title: "Developer",
            IsSenior: true
        } 
    };

$.ajax({
    url: "@Url.Action("ShowPerson", "Home")",
    data: $.param(person),
    success: function (response){
        $("#myDiv").html(response);
    },
    error: function (xhr) {
        $("#myDiv").html("<h1>FAIL</h1><p>" + xhr.statusText + "</p>");
    }
});
</script>

そして、私のHomeControllerは次のようになります。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult ShowPerson(Person person)
    {
        return View(person);
    }
}

「ShowPerson.cshtml」ファイルは、必要になる前に問題が発生するため、今は無視してください。

HomeController.ShowPersonアクションでは、「person.Name」プロパティが正しくバインドされ、「person.JobTitle」オブジェクト(「Title」および「IsSenior」プロパティを含む)がインスタンス化されますが、デフォルト値は「Title=null」のままです。および「IsSenior=false」。

過去に問題なくネストされたモデルのバインドを行ったことがあると確信しています。私は何が欠けていますか?モデルバインディングが1レベルの深さでしか機能しないように見える理由を誰かが明らかにすることができますか?

私はSOを検索しましたが、フォームからデータを送信するときに他のすべての人がバインディングの問題を抱えているようです。そのため、$。ajax()リクエストに何かが欠けている可能性がありますか?

4

2 に答える 2

6

わかりました、あなたがする必要があるいくつかの変更があります、

  • dataTypeを次のように設定しますjson
  • contentTypeを。として設定しますapplication/json; charset=utf-8
  • JSON.stringify()を使用する

以下は変更されたコードです。(テスト済み

var person = { 
    Name: "Bob Smith",
    JobTitle: { 
        Title: "Developer",
        IsSenior: true
    } 
};

var jsonData = JSON.stringify(person);

$.ajax({
  url: "@Url.Action("ShowPerson", "Home")",
  data: jsonData,
  dataType: 'json',
  type: 'POST',
  contentType: "application/json; charset=utf-8",

  success: function (response){
    $("#myDiv").html(response);
  },
  error: function (xhr) {
    $("#myDiv").html("<h1>FAIL</h1><p>" + xhr.statusText + "</p>");
  }
});
于 2012-10-24T10:41:40.990 に答える
0

コンテンツタイプをajaxに追加します

contentType: "application/json; charset=utf-8",
dataType: 'json',
type: 'POST',
data: $.toJSON(person);
于 2012-10-24T10:43:05.510 に答える