ASP.NET MVC 2中的空查询字符串参数的模型绑定

Sim*_*ver 17 asp.net-mvc preview modelbinders

此处描述的行为现在似乎是ASP.NET MVC 2的默认行为(至少对于预览1).

当像这样对一个查询字符串进行模型绑定时:

 ?Foo=&Bar=cat 
Run Code Online (Sandbox Code Playgroud)

发生以下绑定(假设您绑定到具有'Foo'和'Bar'字符串属性的模型)

ASP.NET MVC 1

 model.Foo = "";
 model.Bar = "cat":
Run Code Online (Sandbox Code Playgroud)

ASP.NET MVC 2(预览1到RC)

 model.Foo = null;
 model.Bar = "cat":
Run Code Online (Sandbox Code Playgroud)

想要给任何正在玩V2的人提供一个单挑,因为这在' gu-notes '中没有提到.同样好奇的是,知道的任何人都可以评论这是否是最终实施或可配置功能?无论哪种方式我都很好但只是希望他们不要回到过去的方式!可配置会更好.

编辑:从这一点学习的教训是你正在开发的任何版本,不要编写代表Foo.Length == 0来测试空字符串或Foo.Length> 3以检查最小长度.使用string.IsNullOrEmpty(Foo)和/或首先检查null.


更新:这个问题激起了我对他们为什么会真正做出这种改变的好奇心.我认为在研究残疾人控制时我偶然发现了答案.W3 HTML规范定义了" 成功控制 ",如下所示:

成功的控制对于提交是"有效的".每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分.必须在FORM元素中定义成功的控件,并且必须具有控件名称.

换句话说 - 成功的控件是将其作为查询字符串参数返回服务器的控件.现在,如果控件没有有效值,那么根据规范:

如果控件 在提交表单时没有当前值,则用户代理不需要将其视为成功控件.

(在这里找到'开放式解释'语言'不要求......')

所以我认为通过发送null而不是空字符串,它可以减少某些浏览器可能发送的浏览器不兼容性,Foo=&Bar=而其他浏览器可能甚至不会发送该查询字符串参数.通过总是解释Foo=好像Foo不存在,所以你要更加防守.

我认为我至少在正确的轨道上找到了原因 - 至少在某种程度上与'成功控制'的概念有关.

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

Rob*_*vey 4

Null 更能代表它的实际情况,并且它与除字符串之外的其他可空类型兼容,所以我想这是设计使然。