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

时间:2009-08-11 23:40:47

标签: asp.net-mvc modelbinders preview

行为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不存在,所以你要更加防守。

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我更喜欢v1的行为。你怎么能在v2中传递一个空字符串?此外,对于后者,您无法判断foo是否在查询参数中。

答案 2 :(得分:0)

配置的一种方法是替换V2(或V1)中的默认模型绑定器以获得一致的行为。我更喜欢null,我自己。