0

をビューにバインドしようとしましOrderedDictionaryたが、post メソッドが呼び出されると、ディクショナリは常に空です。

これが私のコードです:

    [HttpGet]
    public ViewResult Edit(string username, string password)
    {
        Xml test = new Xml(@"c:\Users\pc\Desktop\xml - Copy.xml");
        XmlNode userNode = test.GetUserNodeByUsernameAndPassword(username, password);
        User user = new User();
        user.BindData(userNode);
        return View(user.user);
    }

    [HttpPost]
    public ViewResult Edit(OrderedDictionary attributes)
    {
        return View(attributes);
    }

そして、ここにビューがあります:

@using (Html.BeginForm("Edit", "Users")) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>User</legend>

    <p>
        <input type="submit" value="Save" />
    </p>

    @{int counter = 0;}
    @{string name = "";}
    @foreach (DictionaryEntry attribute in Model)
    {
        { name = "[" + counter + "].key"; }
        <input type="hidden" name=@name value=@attribute.Key />
        @attribute.Key @Html.TextBoxFor(m => attribute.Value)
        counter++;
        <br />
    }
</fieldset>
}

結果の Html は次のようになります。

<input type="hidden" value="Username" name="[0].key">
  Username
  <input id="attribute_Value" type="text" value="Anamana" name="attribute.Value">

そのため、のコンテンツはOrderedDictionaryビューに問題なく表示されますが、ポストバックを作成すると、バインディングが機能せず、ディレクトリが空のままになります。

4

2 に答える 2

1

概念

辞書をバインドするには、html 入力タグの name 属性を変更する必要があります。このようなもの:

コントローラーで:

[HttpPost]
public ActionResult Edit(IDictionary<string, string> attributes) 
{  
}

あなたのHTMLで:

<input type="text" name="attributes[0].Key" value="A Key" />
<input type="text" name="attributes[0].Value" value="A Value" />

<input type="text" name="attributes[1].Key" value="B Key" />
<input type="text" name="attributes[1].Value" value="B Value" />

あなたのアクションはそれを期待しているので、名前は名前属性attributesのインデックスの前にある必要があります。[0]

チップ

Asp.Net MVC の HTML ヘルパーを使用しHiddenForます。TextBoxFor

@Html.HiddenFor(model => model[i].Key)
@Html.TextBoxFor(model => model[i].Value)

そして、asp.net mvc が理解して動作させる形式でレンダリングされます。

データバインドに関するその他のサンプルについては、このリンクをご覧ください。

于 2013-01-26T15:43:46.780 に答える
0

その間に私は解決策を見つけました。

OrderedDictionaryビューページにを渡すことができます。次のRazorコードで処理します。

    @model System.Collections.Specialized.OrderedDictionary
    (...)
    @{int counter = 0;}
    @{string name = "";}
    @foreach (DictionaryEntry attribute in Model)
    {
        { name = "[" + counter + "].key"; }
        @Html.Hidden(name, attribute.Key)
        {name = "[" + counter + "].value";}
        @attribute.Key @Html.TextBox(name, attribute.Value)
        counter++;
        <br />
    }

結果HTMLの構造は本にあるサンプルに適合し、辞書の値はページに正しく表示されます。

POSTが呼び出された後、POSTハンドラー関数は変更された値をで取得しますDictionary

    [HttpPost]
    public ViewResult Edit(Dictionary<string, string> attributes)
    {}

理由はわかりませんが、OrderedDictionaryここでは使えません。

于 2013-01-29T18:49:18.927 に答える