2011-12-08 1 views
1

私はチェックボックスがあるモデルを使用しています。私は、常に複数のブール値を取得するフォームを掲示していますところ、コードは「真、偽の」デバッグ中に私がstrの中で、次の値を取得しています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") %> 

続くようです。私は何か間違っているのですか?

+0

この動作は仕様です(信じられているかどうか) – SLaks

答えて

6

これはHtml.CheckBoxの設計方法です。

それは常に
<input name="test" type="hidden" value="false" />続い
<input name="test" type="checkbox" value="true" />
をレンダリングします。
チェックボックスをオンにしてフォームを送信すると、test=true,falseが表示され、チェックボックスをオフにするとtest=falseが表示されます。

これは、,false部分が無視されるため、boolean値へのバインドをサポートする方法です。ただし、他のものにバインドしている場合(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)