使用嵌套模型进行ViewModel验证

时间:2011-02-04 17:56:35

标签: asp.net-mvc-2 validation 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; }
    }

Supervisors是我用来渲染组合的用户列表(SelectListItem) 当我提交表单时,控制器重新绑定对象Reminder:

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

一切正常,我的提醒与选择的用户(用户名)相关联但是,由于我不需要在下拉列表中显示电子邮件,因此绑定无法填写该字段,因为它不存在在我的形式。 在验证过程中,我收到一个错误,因为它试图验证用户模型,这不是我真正想要的。 处理嵌套模型的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用视图模型?它们仅包含您的视图所需的属性以及此特定视图的验证。因此,如果您的视图不需要电子邮件,则可以在没有电子邮件的情况下编写视图模型,并且验证通过很然后在控制器操作中将此视图模型映射到相应的域模型。 AutoMapper是完成这项工作的绝佳工具。