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 steel 是一本 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 回答