2011-02-04 64 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

感謝您的回答達林。據我所知,你建議「扁平化」我的視圖模型?!我的班級remider將有一個不屬於User類型的DepartmentSupervisor屬性...是嗎?你有什麼例子嗎? – LeftyX 2011-02-05 10:25:17