2011-08-11 5 views
2

viewmodel이 있는데 다른 모델 클래스와 연결되지 않은 클래스가 중첩되어 있습니다. 이 중첩 클래스 (ClassX)에서 필요한 데이터를 채워서 뷰에 표시 할 수는 있지만, 포스트 작업에서 다른 매개 변수로 사후 작업으로 지정할 때 중첩 클래스 (MyViewModel을 통해)에서 데이터를 가져올 수 없습니다. . 원래의 뷰 모델 (MyViewModel)에 나타나지만 속성은 null/0입니다.ASP.NET MVC 3 모델 및 viewmodel 클래스

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     classX = new ClassX(); 
    } 

    public ClassX classX; 
    public int attrA {get;set;} 
    ... 
} 
public class ClassX {} 

// 
// POST: /MyModel/Create 
public ActionResult Create(MyViewModel myvm, **ClassX cx**, FormCollection collection) 
{} 

내 질문 : 중첩 클래스에서 viewmodel 클래스를 통해 데이터를 읽을 수 있습니까?

+2

그냥 추측합니다. 변환 프로세스는 속성 만 가져올 것이라고 생각합니다. 나는 당신이 "public ClassX classX"를 바꿀 필요가 있다고 생각한다. "public ClassX classX {get; set;}" –

+0

고맙습니다. 나는 너의 제안을 시도했고 효과가 있었다. – sada

답변

0

http://goneale.com/2009/07/27/updating-multiple-child-objects-and-or-collections-in-asp-net-mvc-views/이 내가 제대로 질문을 이해하면, 당신은 액션 메소드의 당신의 ClassX cx 매개 변수에 BindAttribute.Prefix 필요하면

MyViewModel myViewModel= new MyViewModel(); 
    UpdateModel(myViewModel, "MyViewModel"); 
    myViewModel.myViewModel= new myViewModel(); 
    UpdateModel(myViewModel.classX, "User.classX"); 
+0

감사합니다. 나는 그 기사를 읽을 것이다. – sada

0

에 대한 좋은 기사입니다. 이렇게하면 모델 바인더는 값을 올바르게 바인딩합니다. Bind.Prefix의 값이 예에서 MyViewModel에 ClassX 속성의 이름이어야합니다, 문자열 - 양식을 제출할 때 클라이언트 측에서, 그 값이 서버로 전송 - "classX"

// 
// POST: /MyModel/Create 
public ActionResult Create(MyViewModel myvm, [Bind(Prefix = "classX")]ClassX cx, FormCollection collection) 
{} 

아이디어는 다음에 like

attrA=someValue 
classX.SomeProperty=someValue 
classX.SomeOtherProperty=someOtherValue 

이 매개 변수가 동작 매개 변수에 전달되면이 name = value 문자열 쌍이 객체로 변환됩니다. 평등의 왼쪽에있는 이름은 MyViewModel이라는 속성 이름과 일치하며 ClassX 매개 변수는 비어 있습니다. 그러나 Prefix = "classX"을 지정하면 모델 바인더는 ClassX 속성 이름과 동일한 왼쪽의 점 뒤에 문자열을 일치 시키므로 ClassX 값도 채워야합니다.

+0

답변 해 주셔서 감사합니다. – sada

관련 문제