2011-02-04 9 views
1

내 모델에 두 개의 개체 (미리 알림 및 사용자)가 포함되어 있습니다. 각 미리 알림은 한 명의 사용자와 연결됩니다. 나는 내보기로 데이터를 전달하는 데 사용하는 뷰 모델을 정의한중첩 모델을 사용한 ViewModel 유효성 확인

public class Reminder 
    { 
    [DisplayName("Subject")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(200, ErrorMessage = "{0}: error message.")] 
    public string Name { get; set; } 

    [DisplayName("Supervisor")] 
    public User DepartmentSupervisor { get; set; } 
    } 

public class User 
    { 
    [DisplayName("Username")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(25, ErrorMessage = "{0}: lerror message.")] 
    public string Username { get; set; } 

    [DisplayName("Email")] 
    [StringLength(50, ErrorMessage = "{0}: error message.")] 
    [Email(ErrorMessage="Not valid.")] 
    public string Email { get; set; } 
    } 

:

public class RemindersViewModel 
    { 
     public RemindersViewModel() 
     { 
      this.Supervisors = new List<SelectListItem>(); 
     } 
     public Models.Reminder Reminder { get; set; } 
     public List<SelectListItem> Supervisors { get; set; } 
    } 

감독자는 내가 콤보를 렌더링하는 데 사용할 사용자 (SelectListItem)의 목록입니다.

public ActionResult Edit(Guid id, Models.Reminder Reminder) 
{ 
    if (!ModelState.IsValid) 
    { 
    // PROBLEM. 
    } 
} 

모든 것이 잘 작동하고 난에 이메일을 보여줄 필요가 없기 때문에 내 알림이,은 선택된 사용자 (사용자 이름) 만과 관련된 한 : 나는 양식을 제출하면
컨트롤러는 개체 알림을 리 바인드 드롭 다운, 바인딩이 필드를 채울 수 없기 때문에 내 양식에 존재하지 않습니다. 유효성 검사 프로세스에서 사용자 모델의 유효성을 검사하려고 할 때 오류가 발생합니다. 실제로는 그렇지 않습니다. 중첩 모델을 다루는 가장 좋은 방법은 무엇입니까?

답변

1

보기 모델을 사용해 보셨습니까? 뷰에 필요한 속성과이 뷰에 대한 유효성 검사 만 포함합니다. 따라서보기에 전자 메일이 필요없는 경우 전자 메일없이보기 모델을 작성하면 유효성 검사가 잘됩니다. 그런 다음 컨트롤러 동작 내부에서이 뷰 모델을 해당 도메인 모델에 매핑합니다. AutoMapper은이 직업을위한 훌륭한 도구입니다.

+0

답장을 보내 주셔서 감사합니다. 늘어나는만큼 내 viewmodel을 "평평하게"하는 것이 좋습니다. 내 클래스 remider는 User 유형이 아닌 DepartmentSupervisor 속성을 가질 것입니다 ... 맞습니까? 예제가 있습니까? – LeftyX

+0

@vandalo, 반드시 평평하게 할 필요는 없습니다. 따라서이 특정보기에서 작업 할 속성 만 포함하는'ReminderViewModel'과'UserViewModel'을 가질 수 있습니다. ReminderViewModel에는 UserViewModel 유형의 속성이 있습니다. –

+1

이해하기 시작했습니다. 내 도메인 (엔티티) 클래스가 있다고 생각합니다. 그런 다음 유효성 검사 규칙을 사용하여 중간 클래스 (미리 알림, 사용자 등)를 만들고이 클래스를 내 ViewModel에 중첩합니다. 내가 이해할 수있는 것은 중급 클래스를 없애고 엔티티 (도메인)와 뷰 모델 만 가져야합니다. 맞아? – LeftyX