1

更新: コードからわかるように、1 つのチェックボックス (4) をスキップしたことが判明しました。私の側からのばかげた間違い!

ビューに 16 個のチェックボックスがあり、それぞれをモデル内の bool 配列 (または BitArray) の要素にバインドします。

これを実行しようとすると、フォームを送信した後、コントローラーは配列の最初の 4 つの要素 (ただし正しい値) のみを取得するため、モデルのコンストラクターでより多くのスペースを割り当てようとしましたが、コントローラーは取得さえしませんでした。呼ばれた。これを機能させる方法はありますか、またはチェックボックスごとに bool 変数が必要ですか?

配列:

public bool[] ActiveSettings { get; set; }

意見:

<p><b>Active Settings:</b></p>
<div style="float:left">
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[0]) val0<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[1]) val1<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[2]) val2<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[3]) val3<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[5]) val4<br />
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[6]) val5<br />
@*etc..*@
</div>

コントローラーのデバッガーのスクリーンショットを次に示します (bool[16] である必要があります)。
ここに画像の説明を入力

Html.EditorFor を使用して整数の配列で同じことをテストしたところ、問題なく動作しました。
ありがとう!

更新:
だから私がやったのは、これらの隠しフィールドを次のように設定することです:

@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[0]) val0<br />
@Html.Hidden("NetworkSettings.ActiveSettings[0]",false)
@Html.CheckBoxFor(model => model.NetworkSettings.ActiveSettings[1]) val1<br />
@Html.Hidden("NetworkSettings.ActiveSettings[1]",false)

など...
ただし、奇妙なメモがあります。16個のチェックボックスがあり、最初の5つに隠しフィールドを設定するだけで、魔法のように16個すべてが機能しました。

4

1 に答える 1

2

レンダリングされたhtmlはCheckboxfor何ですか? 5番目のチェックボックスがオフになっていますか?チェックボックスは、値が true の場合にのみフォーム コレクションに送信されます。値が false の場合、送信されません。MS MVC では、配列の値の非分割ゼロベースのインデックスが必要です。

したがって、オプション 1 ~ 4 がチェックされている場合、オプション 5 はチェックされておらず、オプション 6 ~ 16 はビュー モデルにハイドレートされた 1 ~ 4 のみがチェックされています。5 はフォーム コレクションの一部ではなく、6 ~ 16 は無視されます。

これを解決するには、チェックボックスと同じ名前の非表示フィールドも送信する必要があります。非表示フィールドの値は false です。モデルバインダーは最初にチェックボックスの値を使用します。false存在しない場合は、送信されたデフォルト値が使用されます。マークアップは次のようになります

<input type="checkbox" id="networksettings_activesettings_4" name="networksettings.activesettings[4]" value="true" />
<input type="hidden" id="networksettings_activesettings_4_hidden" name="networksettings.activesettings[4]" value="false" />
于 2012-07-30T14:05:51.567 に答える