今天我遇到了一个问题而且我无法得到天气我对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; } 
}
这是我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);
}
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();%>
关键是在Edit(HttpGet)方法中,我创建了Parent具有两个子Child元素的实例,这两个子元素的IsSelected属性分别设置为true和false.在Edit(HttpPost)方法中提交表单之后,我给我的Parent对象一个两个Child元素的新子集合,它们的IsSelected属性分别设置为false和true(与HttpGet方法相反)和调用View()方法来渲染我的模型.
但是我提交后得到的是复选框,用它们渲染Html.EditorFor()并且Html.CheckBoxFor()不改变它们的状态.看起来Html.EditorFor()和Html.CheckBoxFor()方法不是从我的模型中获取数据,而是从发布的表单数据中获取数据.
有人可以解释一下这里发生了什么以及为什么ASP.NET MVC拒绝渲染我的模型?解决方法?修复了我的代码?
提前致谢.
PS我在MVC2中注意到这种行为,并认为这是一种错误,但是当我用MVC3测试它时,它做了同样的事情.
Html.CheckBoxFor() 方法不是从我的模型中获取数据,而是从发布的表单数据中获取数据。
那是对的。
您必须清除 ModelState 才能ModelState.Clear()使这些复选框使用实际模型值而不是表单数据。
| 归档时间: | 
 | 
| 查看次数: | 422 次 | 
| 最近记录: |