2011-09-30 3 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); 
} 

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) 메서드에서 나는을 만듭니다.IsSelected 속성을 갖는 두 개의 자식 Child 요소가있는 인스턴스는 각각 truefalse으로 설정됩니다. 양식 Edit (HttpPost) 방식으로 제출 한 후 내 모델을 렌더링하는 내 Parent (즉 방법 HttpGet을에서 반대) 각각 falsetrue로 설정 자신의 IsSelected 속성이 개 Child 요소의 새로운 자식 컬렉션 개체 및 전화 View() 방법을 제공합니다.

하지만 제출 후 체크 박스는 Html.EditorFor()Html.CheckBoxFor()으로 렌더링되어 상태가 변경되지 않습니다. Html.EditorFor()Html.CheckBoxFor() 메서드는 내 모델에서 데이터가 이 아닌인데 게시 된 양식 데이터에서 가져옵니다.

누군가가 여기에 무슨 일이 일어나고 있는지 설명하고 ASP.NET MVC가 내 모델을 렌더링하는 것을 거부하는 이유를 설명해 주시겠습니까? 해결 방법은 무엇입니까? 내 코드가 수정 되었습니까?

미리 감사드립니다.

P. MVC2에서이 동작을 감지하고 이것이 일종의 버그라고 생각했지만 MVC3에서 이것을 테스트했을 때 똑같은 일을했습니다.

답변

0

Html.CheckBoxFor() 메서드는 데이터를 내 모델이 아닌 양식 데이터로 가져옵니다.

맞습니다.

이 체크 박스에 양식 데이터가 아닌 실제 모델 값을 사용하려면 ModelState를 ModelState.Clear()으로 지워야합니다. Html.EditorFor()와 Html.CheckBoxFor (렌더링하지만 무엇 I 후 제출받을 확인란

+0

감사합니다, 그것은 – Ramunas

2

는) 자신의 상태를 변경하지 않습니다. 그것은 처럼 Html.EditorFor() 및 Html.CheckBoxFor() 메서드는 데이터 을 내 모델이 아니라 게시 된 양식 데이터에서 가져옵니다.

그건 정확히 그들이하는 일이고 그것은 의도적으로 설계된 것입니다. HTML 도우미는 값을 바인딩하고 모델을 작성할 때 먼저 modelstate를 봅니다.당신은 당신이 당신의 컨트롤러 액션에서 수정하고자하는 모델 상태에서 모든 항목을 제거 할 수 있습니다이 동작을 변경하려면 :

[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

관련 문제