web-dev-qa-db-ja.com

ASP.NET MVC辞書へのバインド

MVC内で辞書の値をバインドしようとしています。

私が持っているアクション内:

model.Params = new Dictionary<string, string>();

model.Params.Add("Value1", "1");
model.Params.Add("Value2", "2");
model.Params.Add("Value3", "3");

そして私が持っているビュー内:

@foreach (KeyValuePair<string, string> kvp in Model.Params)
{ 
<tr>
  <td>
    <input type="hidden" name="Params.Key" value="@kvp.Key" />
    @Html.TextBox("Params[" + kvp.Key + "]")
  </td>
</tr>
}

しかし、ビューには初期値が表示されず、フォームが送信されるとParamsプロパティがnullになりますか?

63
user644344

scott hanselmanのこの投稿をご覧ください: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

デフォルトのバインダーは、次の形式の辞書を理解するだけです。

params[0].key = kvp.key
params[0].value = kvp.value

パラメータのインデックスは、0から始まり、ギャップなしで連続している必要があります。現在のヘルパーはこれをサポートしていないため、自分でフォーム入力フィールドを作成する必要があります。

もちろん、次のような独自のバインダーを実装できます。 http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/

56
Jokin

ASP.NET MVC 4では、デフォルトのモデルバインダーは典型的な辞書インデクサー構文を使用して辞書をバインドしますproperty[key]

Dictionary<string, string>モデルで、次のマークアップを使用してモデルに直接バインドできるようになりました。

<input type="hidden" name="MyDictionary[MyKey]" value="MyValue" />

たとえば、一連のチェックボックスを使用してディクショナリの要素のサブセットを選択し、同じプロパティにバインドする場合、次の操作を実行できます。

@foreach(var kvp in Model.MyDictionary)
{
    <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")"
        value="@kvp.Value" />
}
84
Ant P

@AntPの答えに基づいて、MVCがより多くの作業を行うように、さらに冗長な方法があります(少なくともTextBoxFor()Dictionary<string, string>-CheckBoxFor()を試したことはありません) Dictionary<xxx, bool>):

@foreach(var kvp in Model.MyDictionary)
{
    @Html.Label(kvp.Key);
    @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]);
}
22
Sphinxxx