2009-04-24 4 views
2

マイビューのページには、次のチェックボックスコードで検索例によるフォームが含まれていますCheckBox HtmlHelperの予期しない動作ですか?

<td> 
<label for="HasProcessErrors">Has Errors:</label> 
<%= Html.CheckBox("HasProcessErrors", crit.HasProcessErrors) %> 
</td> 

クリティカルオブジェクトHasProcessErrorsプロパティは、その初期値がfalseのブール値です。私は私のレンダリングされたページのソースを表示すると、私はヘルパーは、次のHTMLを生成したことを参照してください。

<td> 
<label for="HasProcessErrors">Has Errors:</label> 
<input id="HasProcessErrors" name="HasProcessErrors" type="checkbox" value="true" /><input name="HasProcessErrors" type="hidden" value="false" /> 
</td> 

は私が間違ってここでのCheckBoxヘルパーを使用しました、または奇数何かが起こっていますか? checked = ""のチェックボックスを入力する必要があるようです。

ありがとうございます。

答えて

3

はいこれは正しいです。

チェックボックスの意味は、あなたが思うかもしれないものと少し異なります。チェック/チェックされていない状態を示す値をポストするのではなく、チェックされたチェックボックスは、その '値'属性にあるものを投稿し、チェックされていないチェックボックスは何も表示しません。

同じ名前の隠しフィールドも存在するので、あなたのフォームが提出デバッグする場合は、あなたがチェックチェックボックスのチェックを外すボックスながら「真偽」の値を持っています

「偽の」値を持っています

'true'が含まれているかどうかをテストして、チェックボックスがオンになっているかどうかを判断できます。

 
public ActionResult(FormCollection form) 
{ 
    bool checked = form["checkbox_id"].ToString().Contains('true'); 
} 
+0

David、ありがとう。私は、これがチェックボックスがチェックされていない場合、ブラウザがサーバーに値をポストバックしないという事実を克服するために行われていることを発見しました。チェックボックスを追加する前に、フォームデータが厳密に型付けされたSearchCriteriaオブジェクトと非常によく拘束されていたので、ここで私の考え方を変更するだけです。今度はFormCollectionオブジェクトをループして値を取得し、その値をSearchCriteriaオブジェクトに手動で転送する必要があります。 –