ASP.NET MVC:jQuery ajax发送的值未被操作绑定到视图模型

时间:2015-04-02 19:31:55

标签: jquery ajax asp.net-mvc

我无法解释为什么我发送给控制器的参数总是为空。这是我的AJAX电话:

var contactViewModel = { "CustCompId": _custCompId, "SuppID": 0 };

$.ajax({
         async: false,
         type: 'POST',
         data: JSON.stringify(contactViewModel),
         url: crudServiceBaseUrl + "GetContacts",
         success: function (result) {
                  contactData = result;
         }                           
  });

这是参数应该发布到

的操作
public JsonResult GetContacts(SuppOrCustViewModel contactViewModel)
{
   //CustCompId and SuppID are always null
}

这就是我定义 SuppOrCustViewModel

的方式
public class SuppOrCustViewModel
{
    public int? CustCompId { get; set; }
    public int? SuppID { get; set; }
}

当我给GetContacts设置一个断点时,contactViewModel中的两个属性都为null。有什么理由吗?看看浏览器发送了什么,这就是我看到的:{"CustCompId":4,"SuppID":0}:

感谢帮助。

1 个答案:

答案 0 :(得分:3)

实际上,我越是想到这一点,我越觉得我之前的回答是错误的。所以我正在修改我的陈述:

这很可能是缺少ajax contentTypes的问题。删除stringify会强制模型绑定器将其视为key/value对,并按预期工作。在不设置正确的contentType的情况下对其进行字符串化会将整个对象视为一个键(没有值)。

我做了以下测试(在这里完整)。

你如何发送它(没有contentType的stingifying):

$.ajax({
     async: false,
     type: 'POST',
     data: JSON.stringify(contactViewModel),
     url: "/echo/json/",
     success: function (result) {
         console.log(result);
     }                           
});

检查实际发送的内容时:

enter image description here

我是如何首先建议的(不是stingifying,即作为键/值对发送):

$.ajax({
     async: false,
     type: 'POST',
     data: contactViewModel,
     url: "/echo/json/",
     success: function (result) {
              console.log(result);
     }                           
});

这很有效,MVC可以正确绑定它。在检查实际发送的内容时:

enter image description here

最后,它应该如何发送(使用contentType进行字符串化):

$.ajax({
     async: false,
     type: 'POST',
     data: JSON.stringify(contactViewModel),
     url: "/echo/json/",
     dataType: 'json',
     contentType: 'application/json',
     success: function (result) {
              console.log(result);
     }                           
});

检查实际发送的内容时:

enter image description here

因此,将contentType与stringify一起使用非常重要。您的可空内容也可能会导致问题(已知会导致模型绑定出现问题),但我确定您能够对其进行排序。