2009-08-11 119 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

相關問題