2012-10-24 148 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