将复杂对象作为参数发送到ASP.NET MVC3中的Post Action

时间:2012-08-27 12:51:31

标签: asp.net-mvc asp.net-mvc-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类型的rv参数替换为Dictionary<string, string>并发送字典,但在这种情况下,rv值始终返回0字典的字典?问题出在哪儿?如何发送字典以发布操作?

更新

我也尝试过这个但尚未奏效(均值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) {

 ...
}

1 个答案:

答案 0 :(得分:4)

您无法发送复杂对象。如果您希望能够将对象反序列化为集合或字典,请阅读following article以了解默认模型绑定器所期望的预期连线格式。

因此,在阅读了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>属性。