2011-12-16 10 views
1

KeyValuePairを継承する特別なユーザーコントロールを作成しました。私のViewModel内 は、プロパティと呼ばれる検索ViewModelへのKeyValuePair型のASP.NET MVC 3バインディングユーザーコントロール

[UIHint("Lookup")] 
public KeyValuePair<string, string> lookup { get; set; } 

ユーザーコントロールは、ユーザーコントロールは、テキストボックスと隠しフィールドの値を設定し、いくつかのjqueryの文を持っている

Html.TextBoxFor(m => m.Value, new { id = "Name", style = "width: 200px; background-color: #C0C0C0" }) 

Html.HiddenFor(m => m.Key, new { id="Guid"}) 

があります。

コントローラのPOSTメソッドにDEBUGを実行すると、Lookupプロパティ内に値が表示されません。

しかし、KeyValuePair の代わりにプロパティのタイプをstringに変更し、User Controlのタイプを変更した場合、値が表示されます。

私は非常に近いと思いますが、私はそれを理解できません。

答えて

4

KeyValuePair構造体には、デフォルトのパラメーターなしコンストラクターがなく、モデルバインダーでインスタンス化することはできません。これらのプロパティだけを持つビューのカスタムモデルクラスをお勧めします。

public class CustomControlViewModel 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

KVPをビューのこのモデルクラスに変換したり、このクラスをアクションのパラメータとして使用したりします。

[HttpGet] 
public ActionResult Lookup() 
{ 
    return View(new CustomControlViewModel { Value = kvp.Value, Key = kvp.Key }); 
} 

[HttpPost] 
public ActionResult Lookup(CustomControlViewModel lookup) 
{ 
    ... 
} 
+0

本当にありがとうございました。 – Anwar

+0

>を実装しているディクショナリを使用して正しく動作するのはなぜですか? –

+0

@MarioLevrero辞書のモデルバインダーが辞書を更新するためにAddメソッドを使用すると仮定します(チェックなし)。 – tvanfosson

関連する問題