行爲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
感謝您的信息,西蒙! – 2009-08-14 15:34:10
謝謝...這個讓我很頭疼的發現...我不知道爲什麼這個改變是通過...雖然沒有真正增加任何價值,除了更多的工作對我們來說! 它與內存優化有關嗎?一個空字符串在面對一個空值時會佔用一些內存? – 2010-01-04 10:45:51
@jalchr - 我已經更新了我的問題,我認爲他們爲什麼這樣做的原因 – 2010-01-05 11:26:10