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