【问题标题】:ViewModel validation with nested models使用嵌套模型进行 ViewModel 验证
【发布时间】:2011-02-04 17:56:35
【问题描述】:

我的模型包含两个对象(提醒和用户)。每个提醒都与一个用户相关联。

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)。
当我提交表单时,控制器会重新绑定对象提醒:

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

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

【问题讨论】:

    标签: asp.net-mvc-2 validation viewmodel


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答达林。据我所知,您建议“展平”我的视图模型?!我的班级提醒将有一个不属于 User 类型的 DepartmentSupervisor 属性……对吗?你有例子吗?
    • @vandalo,不一定会变平。因此,您可能有一个ReminderViewModel 和一个UserViewModel,每个都只包含您将在此特定视图中使用的属性。 ReminderViewModel 将具有 UserViewModel 类型的属性。
    • 我开始明白了。我想我有我的域(实体)类。然后我创建了一些带有验证规则的中间类(提醒、用户等),并将这些类嵌套在我的 ViewModel 中。据我所知,我应该摆脱中间类,只拥有实体(域)和视图模型。对吗?
    • @vandalo,没错。您有无法修改的域类。它们代表您的业务逻辑。然后根据您正在设计的视图的要求定义视图模型类。控制器将执行您的域模型和视图模型之间的映射。
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2016-04-29
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多