2

こんにちは、次のような Dictionary プロパティを持つ MVC 3 プロジェクトで定義されたモデル オブジェクトがあります。

MyObj.ObjDictionary<string,string>

私は2つのコントローラメソッドを持っています.1つはビューを返すことを処理し、もう1つはビューからPOSTされたフォームを処理することです.

public ActionResult Scanner(string val_1, string val_2, string val_3)
{
 //Fetch sessionObj from Model
 MyObj sessionObj = getSessionObj(val_1, val_2, val_3);

 //At this point model.ObjDictionary<string,string> contains data
 return View(sessionObj);
}

[HttpParamAction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Scanner(MyObj model)
{
  //At this point model.ObjDictionary<string,string> is null
  //i.e. binding is not being properly achieved

  //Validate POSTed data
}

ビューで、各キーと値のペア (kvp) を反復処理します。プロパティは動的であり、辞書の値がいくつあるかを知る方法がないため、この方法で行う必要があります。

@using (Html.BeginForm("Action", "Home")) 
{
    @foreach (var kvp in Model.ObjDictionary)
    {
            <span>@Html.Label("Scan " + @kvp.Key)</span>
            <span>@Html.TextBox(kvp.Key, "", new { @style = "font-size:Medium;width:400px;" })</span>
    }
   <input type="submit" name="Cancel" value="Cancel" />
   <input type="submit" id="Scanner" name="Scanner" value="Scanner" />
}

目標は、ユーザーがデータを入力し、そのデータを特定のキーの値にバインドする方法を提供することです。私の問題は、Model.ObjDictionary が POST されると null になることです。何が間違っているのかわかりません。この記事を読みましたが、これは辞書に既存の値があることを前提としています。ModelBinder が、ユーザーが入力したデータを、特定のキーにマップされた辞書値にバインドできる方法はありますか?

4

2 に答える 2

3

あなたが参照した記事はあなたの質問に答えます、あなたは単にあなたのコントロールに正しい名前を提供する必要があります、試してみてください:


@using (Html.BeginForm("Action", "Home")) {
    var i = 0;
    foreach (var kvp in Model.ObjDictionary)
    {
        @Html.Hidden("ObjDictionary[" + i + "].Key", kvp.Key)@kvp.Key
        <span>@Html.TextBox("ObjDictionary[" + i + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span>
        i++;
        <br />
    }

    <input type="submit" value="Submit" />
}
于 2012-05-16T22:07:35.127 に答える
0

ディクショナリの場合、各エントリには、キー用に 1 つのフィールドと値用に 1 つのフィールドが必要です。

@using (Html.BeginForm("Action", "Home")) 
{
    var index = 0;
    @foreach (var kvp in Model.ObjDictionary)
    {
        <span>@Html.Hidden("ObjDictionary[" + index + "].Key", kvp.Key)
        <span>@Html.Label("Scan " + @kvp.Key)</span>
        <span>@Html.TextBox("ObjDictionary[" + index + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span>
        index++;
    }
   <input type="submit" name="Cancel" value="Cancel" />
   <input type="submit" id="Scanner" name="Scanner" value="Scanner" />
}

ところで、この機能をHTML ヘルパー クラスにカプセル化しました。ここでそれと実際のデモを見つけることができます: https://github.com/ErikSchierboom/aspnetmvcdictionaryserialization

于 2013-06-20T10:30:45.953 に答える