如何在ASP.NET MVC 2中绑定空查询字符串参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

现在是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> 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

提问于
用户回答回答于

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

用户回答回答于

我更喜欢v1的行为。你将如何在v2中传递一个空字符串?此外,对于后者,无法分辨foo是否在查询参数中。

扫码关注云+社区