5

ViewModelに2つのプロパティがあります

class ViewModel1
{
    Dictonary<int, string> PossibleValues {get;set;}//key/value
    int SelectedKey {get;set}
}

Html.DropDownListForを使用してこれを編集したい

MVCにViewModelとの間でデータを自動シリアル化させたいので、次のことができます

public ActionResult Edit(ViewModel1 model) ...

これを達成するための最良の方法は何ですか?

4

3 に答える 3

11

wompが言ったように、ブラウザはドロップダウンリストの選択された値のみを送信します。これは、デフォルトのモデルバインダーによって簡単にバインドされます。以下を参照してください。

クライアントでPossibleValuesリストを編集していない場合は、それらを再送信する必要はありません。リストを再入力する必要がある場合は、最初にディクショナリに入力したのと同じ方法を使用して、投稿アクションでサーバー側で実行します。

たとえば、あなたのページでは:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<ViewModel1>" %>
<!-- some html here -->
<%= Html.DropDownListFor(x => x.SelectedKey, new SelectList(Model.PossibleValues, "key", "value"))%>

あなたのコントローラーで

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Edit() {
 var model = new ViewModel1 {
   PossibleValues = GetDictionary()  //populate your Dictionary here
 };
 return View(model);
}

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Edit(ViewModel1 model) { //default model binding
  model.PossibleValues = GetDictionary();  //repopulate your Dictionary here
  return View(model);
}

GetDictionary()は、入力されたディクショナリオブジェクトを返すメソッドです。

詳細については、この同様の質問を参照してください

于 2010-01-30T11:19:08.427 に答える
0

フォームのドロップダウンリストから辞書を作成することはできないと思います。ドロップダウンリストは、プロパティとして設定できる1つの値のみをポストバックしますが、それからディクショナリSelectedKeyを再構築することはできません。PossibleValues

辞書を再構築するには、その中のすべてのエントリにフォームフィールドが必要です。辞書のforeachループで生成された次のようなことを行うことができます。

<input type="hidden" name="PossibleValues[0].Key" value="key0">
<input type="hidden" name="PossibleValues[0].Value" value="value0">
<input type="hidden" name="PossibleValues[1].Key" value="key1">
<input type="hidden" name="PossibleValues[1].Value" value="value1">
.
.
.

最終的には、フォームから辞書を再入力する必要があるかどうか疑問に思います。値を1つしか選択できない場合、PossibleValuesがViewModelの外部(リポジトリなど)からのルックアップではないのはなぜですか?ViewModelと一緒に保存するのはなぜですか?

于 2010-01-30T07:30:31.813 に答える
0

解決策は、ASP.NETMVCフレームワークのカスタムModelBindingです。ここにいくつかの例を示します。

stevesmithblog.com/blog/binding-in-asp-net-mvc

www.singingeels.com/Articles/Model_Binders_in_ASPNET_MVC.aspx

odetocode.com/Blogs/scott/archive/2009/04/27/12788.aspx

odetocode.com/Blogs/scott/archive/2009/05/05/12801.aspx

それらがお役に立てば幸いです...

ありがとう

于 2010-01-30T07:35:13.983 に答える