2009-08-11 121 views
16

行为described here似乎是ASP.NET MVC 2(至少对于预览版1)的默认值。在ASP.NET MVC 2中绑定空查询字符串参数

当modelbinding这样的查询字符串:

?Foo=&Bar=cat 

下发生结合(假设你结合与“富”和“酒吧”字符串属性模型)

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规范定义了“successful control”如下:

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

换句话说 - 一个成功的控制是一个将使其恢复到服务器作为查询字符串参数。现在,如果控制不具有有效的值,则依据规范:

如果控制不具有current value 形式提交时,用户 代理并不需要把它当作 成功控制。

(这里当场“开来解释”语言,“不要求......”)

所以我想通过发送一个空相反,它降低了浏览器兼容性能为空字符串,其中某些浏览器可能发送Foo=&Bar=和其他人可能甚至不会发送该查询字符串参数。通过总是将Foo=解释为好像Foo在所有部队中都不存在,那么你会更加防守。

我想我至少在正确的轨道上为什么在这里 - 至少部分与“成功控制”的概念有关。

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

+0

感谢您的信息,西蒙! – 2009-08-14 15:34:10

+0

谢谢...这个让我很头疼的发现...我不知道为什么这个改变是通过...虽然没有真正增加任何价值,除了更多的工作对我们来说! 它与内存优化有关吗?一个空字符串在面对一个空值时会占用一些内存? – 2010-01-04 10:45:51

+0

@jalchr - 我已经更新了我的问题,我认为他们为什么这样做的原因 – 2010-01-05 11:26:10

回答

4

空更能代表它实际上是什么,以及它与其他可空类型,除了字符串兼容,所以我想它的设计。

+0

我可以看到这对于已经构建大型应用程序的人来说是一个问题,假设使用“”并检查Foo.Length == 0.他们不得不这样做是因为一些新的绑定功能。我有点喜欢“”有时因为它表明我已经设置了一些东西,但这只是一个小点 – 2009-08-12 06:01:36

+0

任何人都在ASP.Net MVC中大量投资,应该已经考虑升级路径,考虑到MVC框架有多年轻。 – womp 2009-08-13 04:18:29

+0

string.IsNullOrEmpty(..)应该覆盖你的基地。 – Runeborg 2009-08-13 12:08:22

0

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

3

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

+0

没有像nullreferenceexception告诉你,你忘了发送正确的东西!起初,我认为这真的搞砸了我,但我认为它进一步思考。很少需要在Web上下文中传递空字符串(或者将其与空值区分)。如果你真的不得不这样做,也许他们会拥有属性,你可以用它来修饰属性。我认为我们会在V2中看到一些很酷的模型绑定功能,并且我认为这会涉及到 – 2009-08-13 18:26:44

+0

@ thomas刚刚更新了我的答案并参考了这个,我想解释为什么http://www.w3.org/TR/html401 /interact/forms.html#h-17.13.2 – 2010-01-05 11:27:07

相关问题