2011-09-30 34 views
5

今天我面临的一个问题,我不能够获取天气我明白的东西错了ASP.NET MVC(以及可能的MVC一般)或我错过一些事情就是这样实现。ASP.NET 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); 
} 

灰褐色是我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实例与具有两个子元素ChildIsSelected属性分别设定为truefalse。形式是Edit(HttpPost)方法提出后,我给我的Parent反对他们IsSelected属性分别设置为falsetrue 2种Child元素的新儿童集合(即从HTTPGET方法对面),并调用View()方法来呈现我的模型。

但我得到提交后复选框,以Html.EditorFor()Html.CheckBoxFor()呈现不改变它们的状态。它看起来像Html.EditorFor()Html.CheckBoxFor()方法采取数据不是从我的模型,但从张贴的表单数据。

可能有人请解释一下我这到底是怎么回事,为什么ASP.NET MVC拒绝使我的模型?解决方法?修复了我的代码?

在此先感谢。

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

回答

0

Html.CheckBoxFor()方法拿不出从我的模型,但是从 提交的表单数据。

这是正确的。

你必须明确的ModelState与ModelState.Clear()让这些复选框使用实际的模型值,而不是形式的数据。

+0

谢谢,它的工作 – Ramunas

2

但我得到提交后复选框,与 Html.EditorFor()和Html.CheckBoxFor(渲染)不改变它们的状态。它 看起来像Html.EditorFor()和Html.CheckBoxFor()方法取数据 不是从我的模型,但从张贴的表单数据。

这就是他们做什么,这就是设计。 Html帮助器在绑定值和模型时首先查看模型状态。如果你想改变这种行为,你可以删除所有从模型的状态,你打算在你的控制器动作来修改项目:

[HttpPost] 
public ActionResult Edit(Parent parent) 
{ 
    ModelState.Remove("Children"); 
    parent.Children = new List<Child> 
    { 
     new Child(4, false, "c"), 
     new Child(5, true, "d") 
    }; 
    return View(parent); 
} 
+0

谢谢你,我知道我失去了一些东西:) – Ramunas