2012-10-24 145 views
3

我想將JSON數據結構傳遞給MVC(3)控制器,將JSON對象轉換爲C#對象,並綁定所有屬性。其中一個屬性是一個簡單的類型。這是基本的模型綁定,對吧?嵌套模型不綁定

這裏是我的模型:

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頁面(這使得AJAX請求,通過其中「人」類的謝靈運匹配的JSON對象):

<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「。

我確信我已經完成了嵌套的模型綁定而沒有問題。我錯過了什麼?任何人都可以闡明爲什麼模型綁定似乎只能工作一個級別?

我已經搜索過了,而且似乎其他人在從窗體發送數據時都遇到綁定問題,所以也許我在$ .ajax()請求中丟失了某些內容?

回答

6

OK,有幾個你需要做的改變,

  • 設置的dataTypejson
  • 設置的contentTypeapplication/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>"); 
    } 
}); 
+0

這工作!我認爲關鍵部分是設置contentType。 –

+0

我以前遇到過這個問題,這也是答案 - 對於成爲工具感到抱歉。再次感謝您的幫助,亞瑟! –

0

添加的內容類型的AJAX

contentType: "application/json; charset=utf-8", 
dataType: 'json', 
type: 'POST', 
data: $.toJSON(person); 
+0

謝謝鴿友,幾乎解決了這個問題,但我花了一段時間搞清楚爲什麼$ .toJSON不工作....(http://stackoverflow.com/questions/7759619/getting-this-error-tojson-是不是一個功能) –

+0

是的,這可能有點過時了。它包含在json2.js中 – dove