2009-02-03 56 views
2

在ASP.NET MVC複選框通過的HtmlHelper代碼在這裏產生的FormsCollection物體接收MVC複選框值的解釋:抽象通過

<%= Html.CheckBox("List_" + mailingList.Key, true) %> 

因爲這HTML:

<input id="List_NEW_PRODUCTS" name="List_NEW_PRODUCTS" type="checkbox" value="true" /> 
<input name="List_NEW_PRODUCTS" type="hidden" value="false" /> 

萬一你想知道爲什麼有一個額外的隱藏領域? - 然後read this。它絕對是一個讓你首先想到'嗯'的解決方案,但是你意識到它是一個非常優雅的解決方案。

我遇到的問題是當我試圖解析後端數據。那麼它的問題就不那麼重要了,如果將來有什麼事情要在框架中改變的話。

如果我使用內置的綁定,一切都很棒 - 它爲我完成。但在我的情況下,我動態生成未知名稱複選框,並在我的模型中沒有相應的屬性。

所以,我最終不得不像這樣寫代碼:

if (forms["List_RETAIL_NOTIFICATION"] == "true,false") { 

} 

或本:

if (forms.GetValues("List_RETAIL_NOTIFICATION")[0] == "true") { 

} 

這兩者我還是看和畏縮 - 尤其是因爲世界上沒有保證,這將始終成爲回報價值。我想知道是否有一種方法可以訪問模型綁定器所使用的抽象層 - 或者如果我與我的控制器卡在一起,「知道」這些關於HTTP POST hack的內容。

是的我可能會有點挑剔 - 但也許是一個更聰明的方式使用模型綁定,我可以用來讀取動態創建的複選框參數。

此外,我希望這篇文章可以幫助其他人搜索:「真實的,錯誤的」。儘管我知道它爲什麼這樣做,我只是忘了,花了一點時間才意識到'呃'。


FYI:我試過其他一些東西,這是我發現:

forms["List_RETAIL_NOTIFICATION"]評估爲「真,假」 forms.GetValues("List_RETAIL_NOTIFICATION")[0]評估爲「真」 (forms.GetValue("List_RETAIL_NOTIFICATION").RawValue as string[])[0]評估爲「真」 forms.GetValues("List_RETAIL_NOTIFICATION").FirstOrDefault()評估板爲 「true」

回答

0

如果您:

  1. 創建一個列表Ø模型r爲「自定義」屬性值
  2. 固有DefaultModelBinder
  3. 重寫BindProperty,並且自定義屬性值在某個適當的位置,如模型類型中的列表。

然後,我認爲這幾乎是你想要的。您正在使用布爾字段的默認綁定,但添加了您自己的自定義屬性,而不依賴於模型類型的反射。有關創建自定義模型聯編程序的更多詳細信息,請參閱Release Candidate的發行說明。

0

默認的模型活頁夾可以處理這種情況。所以,如果您有:

public ActionResult Save(bool List_RETAIL_NOTIFICATION) 

public ActionResult Save(MyObjectWithABoolPropertyToBeBoundFromACheckBox myObject) 

中應該可以正常工作。

+0

謝謝,但正如我所說的「我動態生成名稱未知且在我的模型中沒有相應屬性的複選框」。複選框表示用戶可以註冊的所有不同郵件列表 - 這是數據庫驅動的 – 2009-02-03 22:33:55