2008-11-27 98 views

回答

12

這是完全一樣的修改的Request.QueryString。這兩者在內部都被私有財產所複雜化,可能被認爲是一個錯誤,但是我知道有兩種可能的解決方案(我會忽略掉response.redirect計劃 - 這太可怕了)。

方法之一是使用反射來直接修改集合:

NameValueCollection oQuery = Request.QueryString; 
oQuery = (NameValueCollection)Request.GetType().GetField("_queryString",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Request); 
PropertyInfo oReadable = oQuery .GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
oReadable.SetValue(oQuery, false, null); 
oQuery["foo"] = "bar"; 
oReadable.SetValue(oQuery, true, null); 

B計劃,我認爲借自己更好的單元測試是爲了避免與收集直接打交道,而是把它作爲一個的NameValueCollection到任何你想要處理的方法,從你的任何需要的淺拷貝。我自己用它來模擬Web請求。

編輯:馬克Gravell給了B計劃

+1

更雄辯的理由以這種方式操縱私人的東西絕不是一個建議的事情,應該儘量避免儘可能多地(〜=不惜一切代價)。畢竟他們是有原因的私人的。你會依賴一個特定版本的庫。底層實現的任何更改都可能會破壞您的應用程序。 – 2008-11-30 18:13:23

2

表單是表示客戶端在請求中發送的內容。你想要做什麼?就我個人而言,我會嘗試將「讀取表單」代碼與「用值執行某些操作」代碼分開 - 這樣,您可以儘早進行任何預處理(從表單讀取時),以及以後代碼需要知道什麼是實際上是發送 - 它只需要給它的值(即它不會直接與請求對話)。

如果還意味着您可以測試您的邏輯,而不需要表單,甚至不需要http請求。

其實,ASP.NET MVC會爲你做了很多這方面(上段)...

請注意,您可以更新.Items收集 - 但這是比較模糊一點(即它並不特別涉及表格)。

(歡呼順便說一句固定錯字)

相關問題