2011-08-11 5 views
0

다음과 같은 경우가 있습니다.DefaultModelBinder - ASP.NET MVC2를 사용하여 모델 속성을 바인딩하는 방법

  1. 는 내가 저장/직원 컨트롤러 액션을 편집/직원에서 게시 엔터티 프레임 워크 엔티티 (직원)
  2. 에서 모델로 채워 편집/직원 볼 수 있습니다. 저장/직원의 행동은 예상 속성으로

을 직원이있는 다른 유형 (EmployeeSave) 이것은 편집/직원 방법

public ActionResult Edit(EmployeesEdit command) 
    { 
     var employee = command.Execute(); 
     if (employee != null) 
     { 
      return View(employee); 
     } 
     return View("Index"); 
    } 

이 저장/직원 방법

public ActionResult Save(EmployeesSave command) 
    { 
     var result = command.Execute(); 
     if (result) 
     { 
      return View(command.Employee); 
     } 
     return View("Error"); 
    } 

에게 있습니다 이것은 EmployeeSave 클래스입니다.

public class EmployeesSave 
{ 
    public bool Execute() 
    { 
     // ... save the employee 
     return true; 

    } 
    //I want this prop populated by my model binder 
    public Employee Employee { get; set; } 
} 

MVC DefaultModelBinder는 Employee 및 EmployeeSave 클래스를 모두 해석 할 수 있습니다.

+0

이 무엇에 명령 객체를 생성한다 :보기는 같은 이름의 EmployeeSaveViewModelEmployee의 속성이 포함 된 경우

<input type="text" name="EmployeeSaveViewModel.Property1" /> <input type="text" name="EmployeeSaveViewModel.Employee.Name" /> <input type="text" name="EmployeeSaveViewModel.Employee.SomeProperty" /> 

그런 다음, 당신의 행동은 다음과 같이 볼 수 있었다 (나는 속성 이름을 만든) 당신의 예제에서 action 메소드로 넘어가겠습니까? –

+0

@BlessYahu ASP.NET MVC 기본 모델 바인더 – abx78

답변

1

여기서 BindAttribute을 사용해야 할 수도 있습니다.

[HttpPost] 
public ActionResult Save([Bind(Prefix="EmployeeSaveViewModel")] 
         EmployeeSaveViewModel vm) 
{ 
    if(ModelState.IsValid) 
    { 
     // do something fancy 
    } 

    // go back to Edit to correct errors 
    return View("Edit", vm); 
} 
+0

EmployeesSave를 모델로 사용하면 좋은 접근 방식이 될 수 있습니다. 하지만 편집 작업에서 볼 수 있듯이 방금 추가 한 모델은 Employee입니다. 이것은 내가 가지고있는 것입니다 : ' ' – abx78

+0

이것이 최선의 방법이라고 생각합니다. DefaultModelBinder를 상속 한 경우에도 응용 프로그램의 모든 명령/동작에 대해 사용자 정의 모델 바인더를 작성하는 것은 의미가 없습니다. 명령을 viewmodel로 주입하면 오류를 방지하고 시간을 절약 할 수 있습니다. – abx78

0

HttpPost를 처리하는 편집 작업으로 편집 된 데이터를 다시 전달하여 해결할 수 있습니다. 내부에서 EmployeeSave 객체를 만들고 Employee 속성에 Employee 반환 값을 할당합니다. EmployeeSave 객체를 전달하여 액션 저장을 호출합니다.

[HttpGet] 
public ActionResult Edit() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Edit(Employee employee) 
{ 
    EmployeeSave employeeSave = new EmployeeSave { Employee = employee }; 

    return View("Save", employeeSave); 
} 

또 다른 방법은 Employee 대신 EmployeeSave를 사용하는 것입니다.

+0

대신 EmployeeSave를 사용하면 직원이 문제를 해결할 수 있습니다. 그러나 저는이 명령을 계속해서보고 싶습니다. 따라서 뷰는 모델에서만 작동합니다. 어쩌면 사용자 정의 바인더가 필요합니까? – abx78

관련 문제