2011-09-30 18 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