ASP.NET MVC渲染模型不是我期望的方式

Ram*_*nas 5 c# asp.net-mvc

今天我遇到了一个问题而且我无法得到天气我对ASP.NET MVC(以及可能的MVC)有些不妥之处,或者我对它的实现感到遗憾.

所以,我有一个简单的模型层次结构:

public class Child
{
    public Child(int notId, bool isSelected, string text)
    {
        NotId = notId;
        IsSelected = isSelected;
        Text = text;
    }

    public Child(){}

    // naming: just to make sure I do not mess with some
    // conventional infrastructure
    public int NotId { get; set; }
    public bool IsSelected { get; set; }
    public string Text { get; set; }
}

public class Parent
{
    public List<Child> Children { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

这是我HomeController的编辑动作:

[HttpGet]
public ActionResult Edit()
{
    var parent = new Parent
                    {
                        Children = new List<Child>
                                {
                                    new Child(1, true, "a"),
                                    new Child(2, false, "b")
                                }
                    };
    return View(parent);
}

[HttpPost]
public ActionResult Edit(Parent parent)
{
    parent.Children = new List<Child>
                        {
                            new Child(4, false, "c"),
                            new Child(5, true, "d")
                        };
    return View(parent);
}
Run Code Online (Sandbox Code Playgroud)

Hese是我的Edit.aspx观点:

<!-- Standart HTML elements ommited --> 
<% Html.BeginForm(); %>
<% for (var i = 0; i < Model.Children.Count; i++){%>
<div>
    <%=Html.LabelFor(m => m.Children[i].IsSelected)%>
    <%=Html.EditorFor(m => m.Children[i].IsSelected)%> <!-- lamda -->
    <%=Html.CheckBoxFor(m => m.Children[i].IsSelected)%> <!-- lamda -->
    <%=Html.CheckBox("A", Model.Children[i].IsSelected)%> <!-- simple -->
</div>
<% } %>

<input type="submit" value="Submit" />
<% Html.EndForm();%>
Run Code Online (Sandbox Code Playgroud)

关键是在Edit(HttpGet)方法中,我创建了Parent具有两个子Child元素的实例,这两个子元素的IsSelected属性分别设置为truefalse.在Edit(HttpPost)方法中提交表单之后,我给我的Parent对象一个两个Child元素的新子集合,它们的IsSelected属性分别设置为falsetrue(与HttpGet方法相反)和调用View()方法来渲染我的模型.

但是我提交后得到的是复选框,用它们渲染Html.EditorFor()并且Html.CheckBoxFor()不改变它们的状态.看起来Html.EditorFor()Html.CheckBoxFor()方法不是从我的模型中获取数据,而是从发布的表单数据中获取数据.

有人可以解释一下这里发生了什么以及为什么ASP.NET MVC拒绝渲染我的模型?解决方法?修复了我的代码?

提前致谢.

PS我在MVC2中注意到这种行为,并认为这是一种错误,但是当我用MVC3测试它时,它做了同样的事情.

Joh*_*ell 0

Html.CheckBoxFor() 方法不是从我的模型中获取数据,而是从发布的表单数据中获取数据。

那是对的。

您必须清除 ModelState 才能ModelState.Clear()使这些复选框使用实际模型值而不是表单数据。