代码之家  ›  专栏  ›  技术社区  ›  Simon_Weaver

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

  •  17
  • Simon_Weaver  · 技术社区  · 16 年前

    行为 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>3来检查最小长度。使用string.isNullOrEmpty(foo)和/或先检查是否为空。


    更新: 这个问题激发了我的好奇心,为什么他们会真正做出这种改变。我想我在研究残疾人控制时偶然发现了答案。W3 HTML规范定义了 successful control 如下:

    成功的控件对“有效” 提交。每一次成功的控制 其控件名与其 当前值作为提交的 表格数据集。成功的控制 必须在窗体元素中定义 必须具有控件名。

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

    如果控件没有 current value 提交表单时,用户 不要求代理商将其视为 成功的控制。

    (请在此处注明“开放口译”语言,并注明“无需……”

    因此,我认为通过发送空字符串而不是空字符串,可以减少某些浏览器可能发送的浏览器不兼容 Foo=&Bar= 其他人甚至可能不会发送该查询字符串参数。总是通过解释 Foo= 好像foo根本不在那里,迫使你更加防御性。

    我认为我至少在这里找到了正确的方向——至少在某种程度上与“成功控制”的概念有关。

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Robert Harvey    16 年前

    空更能代表它的实际情况,它与除字符串之外的其他可以为空的类型兼容,所以我认为它是按设计的。

        2
  •  4
  •   Thomas Freudenberg    16 年前

    我更喜欢v1的行为。如何在v2中传递空字符串?另外,对于后者,您无法判断foo是否在查询参数中。

        3
  •  0
  •   Tom Mayfield    16 年前

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

    推荐文章