2011-03-04 12 views
47

MVC内で辞書値をバインドしようとしています。ASP.NET 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ですか?

答えて

49

あなたはスコットHanselman氏からこの記事に見てみる必要があります。 http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

デフォルトのバインダーは、単に形式の辞書を理解する:

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

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

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

73

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

あなたのモデルにDictionary<string, string>を持っている場合、あなたは今、次のマークアップに直接戻ることにバインドすることができます。

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

たとえば、あなたが選択するためのチェックボックスのセットを使用する場合は、辞書の要素のサブセットと背中同じプロパティにバインドするには、あなたが次の操作を行うことができます:@ ANTPの答えに

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

おかげで、バインドする非常に良い方法を。 – valentin

+1

あなたに良い一日! – kingdango

+5

誰かより詳細な回答へのリンクを提供できますか?辞書を試してもうまくいきませんでしたので、古いインデクサー構文を使用する必要がありました。 –

13

ビルを、少なくともMVCは(仕事のもっとやるせ、さらに少ない冗長な方法があります0123でDictionary<string, string>上- Iは)Dictionary<xxx, bool>CheckBoxFor()を試していない。このため

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

'CheckBoxFor'は' Dict 'で動作しますが、値が単なるboolでない特定のキー/値のペアをバインドしたい場合は動作しません。マークアップを自分で作成する必要があります(私の例のように)。 –

+0

これはブーリアンでのみ機能するのはなぜですか?私はDict のためにこれを動作させました。なぜ他のデータ型でもうまくいかない理由はわかりません。 –

+0

@KaiWeber - これはおそらく、 'Dictionary '(実際には、 ''は私の答えに使用しています)で動作します。しかし、私は何か他のものでそれをテストしていません。Ant Pは、型辞書( 'Dictionary <>')のみで、[IDictionary](https://msdn.microsoft.com/en-us/library/system)のような非ジェネリックなコレクションでは機能しないと言います.collections.idictionary.aspx) – Sphinxxx

関連する問題