2010-02-24 79 views
1

當我使用html助手複選框時,它會生成2個表單元素。我明白這是爲什麼,除此之外我沒有任何問題:MVC2複選框問題

取消勾選複選框似乎與'隱藏'值不同步。

我的意思是,當我有一大堆的複選框在一個循環中產生:

<%=Html.CheckBox("model.MarketCategories[" & i & "].Value", category.Value)%> 

和用戶取消選擇和複選框和category.Value爲FALSE,生成的代碼是:

<input checked="checked" id="model_MarketCategories_0__Value" name="model.MarketCategories[0].Value" type="checkbox" value="true" /> 
<input name="model.MarketCategories[0].Value" type="hidden" value="false" /> 

這是錯誤的,因爲值是假的複選框不應該被檢查。

任何想法爲什麼會發生這種情況?

+0

我相信這是預期的行爲,則隱藏字段始終保持爲false,因爲某些瀏覽器在未選中時不會發送複選框。所以你會得到的場景是 真/假 假/假 假 所以基本上,如果其中一個輸入爲真,其檢查,否則它不檢查。隱藏的領域只是爲了確保他們總是有一些數據在那裏檢查。 – dnolan 2010-05-10 16:37:53

回答

0

更糟的是,當它被提交時,它顯示爲「真實的,錯誤的」。非常令人沮喪。

當您以編程方式選中該框時,它不會設置關聯的隱藏字段。您可以通過直接編寫複選框的標記而不是使用MVC控件來輕鬆解決此問題。我最近不得不自己做這件事。這是我的寵物。

有關更多信息,請參閱this link

0

這對我不起作用,因爲我使用強類型視圖/控制器。

我不使用:

public ActionResult ThisLooksWeird(FormCollection result) 
{ 
    var winnars = from x in result.AllKeys 
      where result[x] != "false" 
      select x; 
    // yadda 
} 

我用:

public ActionResult ThisLooksWeird(MyCustomModelObject result) 
{ 
    foreach (KeyValuePair<MarketCategory, Boolean> o in result.Categories) { 
    If (o.Value == True) { 
     // yadda 
    } 
    } 
} 

現在,當我適應我的代碼工作,因爲在你的帖子提出,兩個控件之間的映射(複選框/隱藏)仍然不正確。它採用隱藏組件的值(它始終是頁面加載時存在的值),而不是現在值的複選框。

+0

我得出結論,當使用強類型的視圖/控制器時,複選框助手完全搞砸了。這是行爲完全不是你所期望的。它的狀態不知何故與它所處的最後一個狀態有關,但我無法解釋到底發生了什麼。當我所有的字典成員都是「False」,因此將「False」傳遞給複選框助手時,有時隱藏的值是false,有時候它是真的,但總是複選框似乎被檢查......我很困惑。 – Bitfiddler 2010-02-25 00:43:20

+0

無論我做什麼,Checkbox html helper都會生成一個'checked'複選框(不管傳入函數的值是true還是false)。這是如何通過測試? – Bitfiddler 2010-02-25 01:06:26

+0

最奇怪的是,當我使用我的'全部清除'和'全部選擇'控制器操作時,複選框總是回來選中。只要我開始手動選擇/清除它們,複選框似乎正常工作。但是控制器操作只會將複選框Dictionary中的值設置爲true/false。我不明白爲什麼這會有所作爲? – Bitfiddler 2010-02-25 01:19:29

0

好吧,看起來大衛是對的。這是我誤解了兩個領域如何一起工作,導致他的解決方案不能爲我工作。

如果這可以幫助其他人,這裏是我的解決方案,它是如何工作的:

首先,我不得不手工工藝兩場大衛曾形容...

<input <% 
     If category.Value = True Then 
      %> checked <% 
     End If 
     %> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="true" /> 
<input name="model.MarketCategories[<%=i%>].Value" type="hidden" value="False" /> 

現在快速回顧一下爲什麼有2場:

// Render an additional <input type="hidden".../> for checkboxes. This 
// addresses scenarios where unchecked checkboxes are not sent in the request. 
// Sending a hidden input makes it possible to know that the checkbox was present 
// on the page when the request was submitted. 

現在的原因兩個元件有相同的名稱是這樣的:如果瀏覽器會忽略具有相同名稱的所有其他輸入值一旦爲f用一個有效的價值ound。所以如果你的瀏覽器總是返回複選框的值(不管是否被選中),那麼隱藏的元素將被忽略。另一方面,如果未選中複選框,則瀏覽器不發送複選框值,則緊跟在該複選框後面的元素將將form屬性的值設置爲false並返回THAT。

我的誤解是,我認爲該複選框應該總是存儲實際屬性的值,所以是這樣的:

<input <% 
      If category.Value = True Then 
      %> checked <% 
      End If 
     %> class="filterCheckbox" id="model_MarketCategories_<%=i%>__Value" name="model.MarketCategories[<%=i %>].Value" type="checkbox" value="<%=category.Value %>" /> 

這是什麼造成的問題...複選框「價值」應該總是爲真。隱藏的「價值」應該始終是錯誤的。這是複選框的狀態(選中或不選),將決定將哪些內容返回給控制器。

感謝大衛......有時候答案可能就在你的面前,但如果你的大腦還沒有準備好接受,沒有什麼資深程序員可以做;-)