发送一个复杂的对象作为参数传递给POST操作在ASP.NET MVC3(Send a Complex

2019-06-27 10:21发布

我尝试发送一个参数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>

所以,你可以只需更换stringrv与参数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) {

 ...
}

Answer 1:

您不能发送复杂的对象。 请阅读下面的文章来,如果您希望能够对象序列化的集合或字典默认的模型绑定期望了解的预期传输格式。

所以,阅读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.MyDictionaryIDictionary<string, string>属性。



文章来源: Send a Complex Object as a Parameter to Post Action in ASP.NET MVC3