MVC4 ModelBinding:Dictionary <int,myclass [] =“”> </int,>

时间:2014-05-28 09:03:48

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个MVC4网络应用程序。

我的模型包含一个Dictionary,其值是我自己的一个类的数组。

鉴于下面的观点,我期望默认模型绑定器能够在我提交到Post动作时重建模型/字典,但事实并非如此。

我得到一个MyModel实例和ModelState.IsValid == true,但字典中没有键/值对。

我是否遗漏了某些内容(不符合规定的约定?)或者这是一个需要自定义模型绑定器/挖掘Request.Form集合的场景?

重现此行为的示例代码:

模型

public class MyClass
{
    public int MyInt { get; set; }

    public string MyString { get; set; }
}

public class MyModel
{
    public Dictionary<int, MyClass[]> MyDictionary { get; set; }
}

查看

@using (Html.BeginForm("MyAction", "Home", FormMethod.Post))
{
    foreach (var key in Model.MyDictionary.Keys)
    {
        <hr />@key<br />
        for (int i = 0; i < Model.MyDictionary[key].Length; i++)
        {
            @Html.HiddenFor(m => m.MyDictionary[key][i].MyInt);
            @Model.MyDictionary[key][i].MyInt
            @Html.TextBoxFor(m => m.MyDictionary[key][i].MyString);<br/>
        }
    }
    <hr />
    <button type="submit">Post</button>
}

控制器

[HttpGet]
public ActionResult MyAction()
{
    var model = new MyModel()
    {
        MyDictionary = new Dictionary<int, MyClass[]> {
            {10, new MyClass[] { new MyClass  { MyInt = 1, MyString = "Foo" }, new MyClass { MyInt = 2, MyString = "Bar"}}},
            {20, new MyClass[] { new MyClass  { MyInt = 3, MyString = "Fubar" }}}
        }
    };
    return View(model);
}

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    return View(model);
}

1 个答案:

答案 0 :(得分:1)

您需要了解Hanselman发布的默认模型绑定器。

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

在你的情况下,你对键和值采取了不同的控制,你的模型绑定器将无法理解发生了什么。

从以下链接查看类似问题。 ASP.NET MVC Binding to a dictionary