我无法解释为什么我发送给控制器的参数总是为空。这是我的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}:
感谢帮助。
答案 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);
}
});
检查实际发送的内容时:
我是如何首先建议的(不是stingifying,即作为键/值对发送):
$.ajax({
async: false,
type: 'POST',
data: contactViewModel,
url: "/echo/json/",
success: function (result) {
console.log(result);
}
});
这很有效,MVC可以正确绑定它。在检查实际发送的内容时:
最后,它应该如何发送(使用contentType进行字符串化):
$.ajax({
async: false,
type: 'POST',
data: JSON.stringify(contactViewModel),
url: "/echo/json/",
dataType: 'json',
contentType: 'application/json',
success: function (result) {
console.log(result);
}
});
检查实际发送的内容时:
因此,将contentType与stringify一起使用非常重要。您的可空内容也可能会导致问题(已知会导致模型绑定出现问题),但我确定您能够对其进行排序。