2011-12-08 29 views
1

我正在使用複選框在那裏的模型。在那裏我張貼的形式,我總是得到一個以上的布爾值,代碼是如下HTML.CheckBox行爲

//controller code 

    // GET: /Home/ 
     // GET: /Home/Test 
     public ActionResult HomeTest() 
     { 
      HomeTest ht = new HomeTest(); 
      return View(ht); 
     } 



     [AcceptVerbs(HttpVerbs.Post)] 
     [ValidateInput(false)] 
     public ActionResult HomeTest(FormCollection collection, HomeTest model) 
     { 
      string str = collection["test"].ToString(); 
      return View(model); 
     } 

//View Html 

<%= Html.CheckBox("test") %> 

我得到str中下面的值在調試「真,假」。我做錯了什麼?

+0

此行爲是設計使然的(不管你信不信) – SLaks

回答

6

這就是Html.CheckBox的設計!

它總是呈現
<input name="test" type="checkbox" value="true" />
接着是
<input name="test" type="hidden" value="false" />
當您提交表單並勾選複選框時,您將獲得test=true,false,並且取消選中該複選框後,您將獲得test=false

這是它如何支持綁定到boolean值,因爲,false部分被忽略。但是,如果您綁定了其他內容(例如string),那麼您將看到"true,false"值。

如果你想要不同的行爲,你將不得不推出自己的Html.CheckBoxAlt方法。這裏有一個類似的問題,以及我之前編寫的一些代碼:Passing checkbox selection through to an action

2

MVC以這種方式做事情,因此它可以區分「沒有複選框稱爲'測試'」和「複選框稱爲'測試「未被選中。」由於HTML沒有提供任何內置方式來區分差異,因此MVC會始終發送一個「false」值,如果您選中該框,則該值將被「true」值覆蓋。

最簡單的解決方案是更好地使用MVC的方法。而不是使用FormCollection,只需使用模型聯編程序可以綁定的參數:

public ActionResult HomeTest(bool test, HomeTest model) 
相關問題