Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模型绑定是绑定我的json数组,但不是绑定值_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Model Binding - Fatal编程技术网

C# 模型绑定是绑定我的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

我正在使用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: 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',
    -设置正确的请求内容类型头
  • data:JSON.stringify({positions:widgetPositions})
    -发送JSON请求
现在,您将很高兴在这里获得所需的一切:

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
}