行为described here现在似乎是ASP.NET MVC2的默认设置(至少对于预览版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":
因为在“gu-notes”中没有提到这一点,所以我想给任何玩V2的人提个醒。同样好奇的是,是否有知情人士可以评论这是最终的实现还是可配置的功能?无论哪种方式,我都很好,但只希望他们不会回到原来的方式!如果是可配置的就更好了。
编辑:从这一点上学到的教训是,无论你开发的是什么版本,都不要编写代码,不要写Foo.Length == 0来测试空字符串,或者Foo.Length >3来检查最小长度。先使用string.IsNullOrEmpty(Foo)和/或检查null。
更新:这个问题激起了我的好奇心,为什么他们会做出这样的改变。我想我是在研究禁用控件的时候偶然发现了答案。W3 HTML规范定义了一个'successful control‘,如下所示:
成功的控件对于提交是“有效的”。每个成功的控件都有与其当前值成对的控件名称,作为提交的表单数据集的一部分。成功的控件必须在表单元素中定义,并且必须具有控件名称。
换句话说,成功的控件是将其作为查询字符串参数返回服务器的控件。现在,如果一个控件没有有效的值,那么根据规范:
如果提交表单时控件没有current value,则不需要用户代理将其视为成功的控件。
(在这里用“不需要...”来指出“开放解释”的语言)
所以我认为通过发送null而不是空字符串,可以减少浏览器的不兼容性,某些浏览器可能会发送Foo=&Bar=
,而其他浏览器可能甚至不会发送查询字符串参数。总是把Foo=
解释得好像Foo根本不存在,这迫使你变得更具防御性。
我认为我至少在正确的轨道上解释了为什么会出现这种情况--至少在一定程度上与“成功控制”的概念有关。
https://stackoverflow.com/questions/1263563
复制相似问题