C# 模型绑定是绑定我的json数组,但不是绑定值
我正在使用ASP.NET MVC 3,我正在尝试将一个简单的json数组模型绑定到C# 模型绑定是绑定我的json数组,但不是绑定值,c#,asp.net,asp.net-mvc,asp.net-mvc-3,model-binding,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Model Binding,我正在使用ASP.NET MVC 3,我正在尝试将一个简单的json数组模型绑定到列表JsonPositions是一个自定义对象,其属性与数组中的json对象相同 以下是我的阵列在客户端上的外观: var widgetPositions = [ { col: 5, row: 1, id: 2 }, { col: 4, row: 5: id: 40 } ]; $.ajax({ url: 'the url', data: { positions: widgetPos
列表
JsonPositions
是一个自定义对象,其属性与数组中的json对象相同
以下是我的阵列在客户端上的外观:
var widgetPositions = [
{ col: 5, row: 1, id: 2 },
{ col: 4, row: 5: id: 40 }
];
$.ajax({
url: 'the url',
data: { positions: widgetPositions },
success: function () {
alert('Save successful.');
},
error: function () {
alert('An error occurred while trying to update the widget positions.');
}
});
在Chrome中检查请求时,此代码似乎工作正常
在控制器中,我们有以下操作方法:
public void UpdatePositions(List<JsonPosition> positions)
{
// debugging here
}
感谢您提供的帮助:)我认为您可能需要添加内容类型:
$.ajax({
url: 'the url',
data: JSON.stringify({ positions: widgetPositions }),
contentType: 'application/json',
success: function () {
alert('Save successful.');
},
error: function () {
alert('An error occurred while trying to update the widget positions.');
}
});
另外,您没有指定请求类型,因此默认情况下它将执行GET,您的意思是执行POST吗?那就够了
$.ajax({
url: 'the url',
type: 'POST',
data: JSON.stringify({ positions: widgetPositions }),
contentType: 'application/json',
success: function () {
alert('Save successful.');
},
error: function () {
alert('An error occurred while trying to update the widget positions.');
}
});
您可以将它们作为JSON对象发送:
var widgetPositions = [
{ col: 5, row: 1, id: 2 },
{ col: 4, row: 5: id: 40 }
];
$.ajax({
url: 'the url',
data: JSON.stringify({ positions: widgetPositions }),
contentType: 'application/json',
success: function () {
alert('Save successful.');
},
error: function () {
alert('An error occurred while trying to update the widget positions.');
}
});
需要注意的是,代码中没有包含这些内容,这将使代码正常工作:
-设置正确的请求内容类型头contentType:'application/json',
-发送JSON请求data:JSON.stringify({positions:widgetPositions})
public void UpdatePositions(List<JsonPosition> positions)
{
// debugging here
}
public void UpdatePositions(列表位置)
{
//在这里调试
}
备注:
JSON.stringify
方法在所有现代浏览器中都是本机定义的(即使在IE8中,即使它远不是现代浏览器)。但是,如果您需要支持某些史前浏览器,您可以将脚本包含到页面中,该脚本将检查浏览器是否本机支持此方法,如果不提供实现。当我这样做时,我会从服务器收到一个新错误。“无效的JSON原语:位置。”哦,是的,我的错-您还需要JSON.stringify JSON对象。看@Darin的回答这是准确的,只是遗漏了一件事。我还必须包括数据类型:“json”
,否则模型绑定根本不会发生。我四处寻找最少的必要属性,事实上contentType、JSON.stringify和dataType都是必需的。删除其中任何一个都会导致它失败,或者根本不绑定列表,绑定但不填充属性,或者抛出无效的json原语错误。谢谢您的帮助。不,您不需要包括数据类型。jQuery从响应内容类型
标题推断出它。人们通常将其包含在编写糟糕的PHP脚本中,而这些脚本没有正确设置此响应头。例如,它们设置内容类型:“text/html”
,但实际上返回JSON。使用ASP.NETMVC,您不需要任何类似的东西。您只需从控制器操作返回一个JsonResult,框架就会处理好一切。另一方面,我相信它应该是contentType
而不是content type
,因为json属性名称中不允许使用连字符,是吗?这是准确的,只是缺少了另一个属性。我在applechewer的回答中描述了遗漏的内容。谢谢你的帮助:)@AlexFord,不,你弄错了什么<代码>数据类型:“json”
与模型绑定完全无关。这将指定响应类型。但是jQuery足够智能,可以从响应内容类型头推断出它。因此,如果在控制器操作中返回JsonResult,它将自动解析传递给success函数的参数。数据类型不是必需的。我能告诉你的是,如果我没有包括它,那么它就不起作用了。我不知道具体细节,但我的测试非常彻底。看来你是对的。不知道我到底在做什么,但我只是试图删除它,以便我可以为您截屏错误,但它没有它的工作。我发誓我没有疯,但我一定是犯了另一个让我发疯的错误。
public void UpdatePositions(List<JsonPosition> positions)
{
// debugging here
}