行为described here现在似乎是ASP.NET MVC 2的默认设置(至少对于预览1)。
当像这样对一个查询字符串进行模型绑定时:
?Foo=&Bar=cat
发生以下绑定(假设您绑定到具有'Foo'和'Bar'字符串属性的模型)
ASP.NET MVC 1
model.Foo = "";
model.Bar = "cat":
ASP.NET MVC 2(预览1到RC)
model.Foo = null;
model.Bar = "cat":
想要给正在玩V2的人提供一个抬头,因为“gu-notes”中没有提及。如果知道的任何人可以评论这是否是最终实施或可配置功能,也很好奇?无论哪种方式我都很好但只是希望他们不要回到过去的方式!可配置会更好。
编辑:从这一点上学到的教训是你正在开发的任何版本,不要编写代表Foo.Length == 0来测试空字符串或Foo.Length&gt ; 3检查最小长度。使用string.IsNullOrEmpty(Foo)和/或首先检查null。
更新:这个问题引发了我对他们为何真正做出这一改变的好奇心。我认为在研究残疾人控制时我偶然发现了答案。 W3 HTML规范定义了一个“successful control”,如下所示:
成功的控制是“有效的” 提交。每个成功的控制 将其控制名称与其配对 当前值作为提交的一部分 表格数据集。成功的控制 必须在FORM元素中定义 并且必须有控制名称。
换句话说 - 成功的控件是将其作为查询字符串参数返回服务器的控件。现在,如果控件没有有效值,那么根据规范:
如果控件没有current value 提交表单时,用户 代理商不需要将其视为 成功的控制。
(在这里找到'开放式解释'语言'不要求......')
所以我认为通过发送null而不是空字符串,它可以减少某些浏览器可能发送Foo=&Bar=
的浏览器不兼容性,而其他浏览器甚至可能不会发送该查询字符串参数。总是将Foo=
解释为好像Foo不存在,所以你要更加防守。
我认为我至少在正确的轨道上找到了原因 - 至少在某种程度上与'成功控制'的概念有关。
答案 0 :(得分:4)
Null更能代表它的实际内容,并且它与字符串之外的其他可空类型兼容,所以我想它是设计的。
答案 1 :(得分:4)
我更喜欢v1的行为。你怎么能在v2中传递一个空字符串?此外,对于后者,您无法判断foo是否在查询参数中。
答案 2 :(得分:0)
配置的一种方法是替换V2(或V1)中的默认模型绑定器以获得一致的行为。我更喜欢null,我自己。