3

submitアクションを投稿するためのボタン付きのパラメーターを送信しようとしているので、サンプルがあります。

@using(Html.BeginForm(actionName: "Search", controllerName: "MyController", routeValues: new { rv = "102" })) {

   ...
  <input type="submit" value="Search" />
}

そして、これは私の検索アクションです:

[HttpPost]
public virtual ActionResult Search(string rv, FormCollection collection) {

 ...
}

だから今まではすべて大丈夫です

次に、次のような複雑なオブジェクトを送信しようとしますDictionary<string, string>

したがって、パラメータstringのタイプをに置き換えて辞書を送信するだけで済みますが、この場合、値は常に0カウントの辞書を返しますか?問題はどこだ?アクションを投稿するために辞書を送信するにはどうすればよいですか?rvDictionary<string, string>rv

アップデート

私もこれを試しましたが、まだ機能していません(平均rv鋼は0カウントの辞書です):

@using(Html.BeginForm(actionName: "Search", controllerName: "MyController", routeValues: new { rv = Model.MyDictionary }, method: FormMethod.Post, htmlAttributes: new { @class = "FilterForm" })) {

 ...
}

[HttpPost]
public virtual ActionResult Search(Dictionary<string, string> rv, FormCollection collection) {

 ...
}
4

1 に答える 1

4

複雑なオブジェクトを送信することはできません。次の記事を読んで、オブジェクトをコレクションまたはディクショナリに逆シリアル化できるようにする場合に、デフォルトのモデルバインダーが期待する予想されるワイヤーフォーマットを理解してください。

したがって、ScottHaの記事を読み、辞書に予想されるワイヤ形式を理解した後、規則に従って辞書をRouteValueDictionaryに変換するカスタム拡張メソッドをロールすることができます。

public static class DictionaryExtensions
{
    public static RouteValueDictionary ToRouteValues(this IDictionary<string, string> dict)
    {
        var values = new RouteValueDictionary();
        int i = 0;
        foreach (var item in dict)
        {
            values[string.Format("[{0}].Key", i)] = item.Key;
            values[string.Format("[{0}].Value", i)] = item.Value;
            i++;
        }
        return values;
    }
}

次に、ビューで次の拡張メソッドを使用できます。

@using(Html.BeginForm(
    actionName: "Search", 
    controllerName: "MyController", 
    routeValues: Model.MyDictionary.ToRouteValues(), 
    method: FormMethod.Post, 
    htmlAttributes: new RouteValueDictionary(new { @class = "FilterForm" }))
) 
{
    ...
}

明らかにここでModel.MyDictionaryは、それはIDictionary<string, string>プロパティであると思います。

于 2012-08-27T14:51:02.300 に答える