Asp.net mvc ASP.NET MVC 4-ModelBinder错误

Asp.net mvc ASP.NET MVC 4-ModelBinder错误,asp.net-mvc,model-binding,Asp.net Mvc,Model Binding,所以我在玩我的ASP.NETMVC4解决方案。每件事都很顺利,不断地添加一些东西,但奇怪的事情开始发生了 我的一个模型属性为null,即使我将Json中的项传递给它 这就是传递给它的javascript对象/json: var obj = { "plc": "False", "al": ["386", "710"], "pl": ["9530", "211", "783"] }; 我正在使用一个定制的模型活页夹。。。我想这可能是个问题,所以我把它关掉了 尝试使用.NET

所以我在玩我的ASP.NETMVC4解决方案。每件事都很顺利,不断地添加一些东西,但奇怪的事情开始发生了

我的一个模型属性为null,即使我将Json中的项传递给它

这就是传递给它的javascript对象/json:

var obj = {
    "plc": "False",
    "al": ["386", "710"],
    "pl": ["9530", "211", "783"]
};
我正在使用一个定制的模型活页夹。。。我想这可能是个问题,所以我把它关掉了

尝试使用.NET中的JavaScriptSerializer查看其是否有效:

var reader = new StreamReader(Request.InputStream);
Request.InputStream.Position = 0;
var readToEnd = reader.ReadToEnd();

var javaScript = new JavaScriptSerializer();
var searchFarmOptions = javaScript.Deserialize<Test>(readToEnd);
不工作 PL服务器端现在有
null

var obj = {
    "pl": ["9530", "211", "783"],
    "al": ["386", "710"],
    "alc": "false",
    "pl-odd-value": "false"
};
工作 PL具有json对象字符串的3个值

var obj = {
    "pl": ["9530", "211", "783"],
    "al": ["386", "710"],
    "alc": "false",
    "odd-value-pl": "false"
};

这肯定是个错误。我只是花了几个小时调试MVC4源代码来解决同样的问题。主要根本原因是您有一个名称为另一个属性名称开头的集合。在您的示例中:pl和pl奇数值

如果你再多玩一些,你可能会发现有时候它能正常工作。它看起来是随机的原因是模型绑定器执行二进制搜索来定位要绑定的值。二进制搜索使用“分而治之”的方法在已发布属性的排序列表中查找属性。如果搜索在分治中测试p1奇数值,则会出现问题。如果搜索跳过此值,则没有问题

当对象中只有包含1个元素的pl集合和pl奇数值属性时,此问题最容易重复

这里有更多与此相关的信息。有一个列出所有回发值的分类列表。在测试失败的情况下,排序列表如下所示:

alc, "false",
al[0], "386"
al[1], "710"
pl-odd-value, "false"
pl[0], "9530"
pl[1], "211"
pl[2], "783"
请注意,排序顺序使用StringComparer.OrdinalIgnoreCase,它将方括号项放在纯文本项之后。当MVC对al或pl集合执行二进制搜索时,它搜索的是al或pl,而不是al[或pl[。通过搜索不带方括号的集合名称,al 解决方法是确保所有属性名称都不以任何集合属性名称开头。请将您的al集合重命名为maybe al_collection,将您的pl集合重命名为maybe pl_collection。

安装。我认为您遇到了我在中讨论过的错误。

回答得好

我今天也遇到了同样的问题,我花了将近3个小时试图找出问题所在,突然我意识到具有相同前缀的属性有一些奇怪的地方

更多信息请点击此处:


你是说AL和ALC值不为空吗?AL和ALC得到了正确的值…当设置了
PLC
PL
总是为空。请参见
Update 1
…我只是想知道ModelBinder是否对某些属性名称有魔力。我自己从未经历过类似的事情,从本质上讲,ModelBinder必须接受没有任何有效的对象名称,因为您的模型可以包含任何有效的对象名称。但是,发布此类内容的最佳位置是MVC的官方CodePlex网站:我只是在这里发布,以确认存在一些愚蠢的事情。甚至ActionMethod中的
TryUpdateModel
方法也在工作。我已经说不出话了,ModelBind也无法使用了呃对我来说有点复杂。
var obj = {
    "pl": ["9530", "211", "783"],
    "al": ["386", "710"],
    "alc": "false",
    "pl-odd-value": "false"
};
var obj = {
    "pl": ["9530", "211", "783"],
    "al": ["386", "710"],
    "alc": "false",
    "odd-value-pl": "false"
};
alc, "false",
al[0], "386"
al[1], "710"
pl-odd-value, "false"
pl[0], "9530"
pl[1], "211"
pl[2], "783"