web-dev-qa-db-ja.com

Html.CheckBoxは、選択されている場合でも、無効にするとfalseを返します

うまくいけば、asp.net mvc gurusへの簡単な質問:

次のように作成されたチェックボックスがあります。

<%=Html.CheckBox("MyCheckBox", true, new { disabled = "disabled"})%>

私の行動では、次のように値をチェックしています。

bool isChecked = form["MyCheckBox"].Contains("true");

チェックされているので、これがtrueを返すことを期待しています。ただし、作成される非表示の要素には誤った値があります。

<input checked="checked" disabled="disabled" id="MyCheckBox" name="MyCheckBox" type="checkbox" value="true" />
<input name="MyCheckBox" type="hidden" value="false" />

まず、HtmlHelperを期待どおりに動作させる方法はありますか?または、手動で入力を作成する/独自のヘルパーメソッドを作成することが唯一の方法ですか? (これは大したことではありません...)

次に、チェックボックスがこのように動作する理由を誰かが明らかにすることができますか?チェックされている無効なチェックボックスが== trueであると想定するのは間違っていますか?無効状態は意味的に偽を意味しますか?

27
elwyn

disabled="disabled"属性でマークされた入力フィールド[〜#〜] never [〜#〜]は、その値をサーバーに送信します。これを実現したい場合は、readonly="readonly"属性を使用できます。これにより、ユーザーは値を変更できなくなりますが、フォームの送信時に既存の値が送信されます。

33
Darin Dimitrov

それがあなたの問題を解決するかどうかはわかりませんが、これは私にとっての解決策でした:

私のモデルにはUserMigratedブールプロパティがあります。ユーザーが移行を設定すると、元に戻すことはできないため、ビューは次のようになります。

@if (Model.UserMigrated)
    {
    <td>@Html.CheckBox("chkBoxReadOnly", true, new {disabled = "disabled"})</td>
        @Html.HiddenFor(m => m.UserMigrated)
    }
else
    {
    <td>@Html.CheckBoxFor(m => m.UserMigrated)</td>
    }
2
LeoFraietta

1)私の観点からは、Html.CheckBoxメソッドの動作を変更する方法はありません。私は以前に問題に直面しなければならず、あなたが提案するように入力チェックボックスを手動で作成することになりました。ヘルパーメソッドを使用することは必ずしも天国ではないため、入力チェックボックスを作成することは必ずしも地獄ではありません。もちろん、独自のヘルパーメソッドを構築することは正しい選択です。

2)フォームの送信時に無効な入力フィールドは投稿されません;チェックされているかどうかに関係なく、無効な入力チェックボックスファイルを送信して同じことを期待します。

チェックボックスが選択されていない場合、チェックボックスを要求にプッシュするための入力非表示フィールドに依存するにドープされた選択について議論することができます。 この選択の副作用は、チェックボックスが無効になっている場合でも、投稿されたデータからチェックボックス名が見つかることです上記の内容と一致しません:フォームが次の場合、無効な入力フィールドは投稿されません提出済み

2
Ghini Antonio

チェックボックスにdisabledを使用しようとすると、同様の問題が発生しました。私の解決策は、ユーザーがフィールドを変更するためのアクセス権を持っていなかったため、チェックボックスを表示しないことでした。

また、Html.HiddenForが存在することを確認して、値が保持されるようにしました。