ASP.NET MVC中的验证应该放在ViewModel还是Model中?

5

我有一个包含基本信息的模型。然而,我的视图需要更多信息才能显示,因此我认为需要一个ViewModel来显示额外的信息。但是,我应该在模型中添加验证属性,以便在执行Code-First迁移时,它会自动为我创建具有每个列的正确数据类型数据库,还是应该将验证属性添加到ViewModel中,因为表单应该验证填写的信息?

public class Module
{
    [Key]
    public int id { get; set; }

    [Required]
    [StringLength(100)]
    [Column(TypeName = "varchar")]
    [Display(Name="Module Name")]
    public string ModuleName { get; set; }
}


public class ModuleViewModel
{
    [Key]
    public int id { get; set; }

    [Required]
    [StringLength(30)]
    [Column(TypeName="varchar")]
    [Display(Name="Module ID")]
    public string ModuleID { get; set; }

    [Required]
    [StringLength(100)]
    [Column(TypeName = "varchar")]
    [Display(Name="Module Name")]
    public string ModuleName { get; set; }

    //To populate dropdownlist 
    public List<SelectListItem> ModuleLevelList { get; set; }

}

在这种情况下,我真的需要一个ViewModel吗?


我猜这是双向的... - Rajshekar Reddy
Module类是您的实体类,将验证放入其中没有任何意义,您可以使用视图模型进行验证和其他内容以在视图页面上显示,在这种情况下,您需要将实体类映射到视图模型类。 - Divyang Desai
请注意,model-view-controller标签是用于关于该模式的问题。针对ASP.NET-MVC实现,有特定的标签。 - user3559349
2个回答

6
数据注释属性用于用户输入验证,应放在视图模型上。对于Entity Framework Code First的数据注释应该放在模型上。
它们是概念上的两个不同的事物,一个是验证输入,另一个是使用EF Code First生成数据库。
例如,Entity Framework Code First中的Required和StringLength会创建一个varchar(length)NOT NULL类型的数据库列。而视图模型上的Required和StringLength用于验证用户输入。不要混淆这两者,重复使用StringLength(length)并没有什么问题。如果您只想在一个地方表达长度值,请将其放入静态常量中。

1
谢谢您的反馈~! - Pow4Pow5

3
我强烈建议您使用视图模型。您可能现在认为它是多余的,但我向您保证它非常有用,而且在未来你会感激我的建议。在过去的很多次尝试中,我一直被烧伤,试图在任何地方都只使用模型对象,并且过度依赖数据注释,就像您一样。此外,您不必在模型层中添加视图层垃圾,例如 [Display(Name="Module Name")]。
在您的情况下,我建议这样做:
public class Module
{
[Key]
public int id { get; set; }

[Required]
[StringLength(100)]
[Column(TypeName = "varchar")]
public string ModuleName { get; set; }
}


public class ModuleViewModel
{
public int id { get; set; }

[Required]
[StringLength(30)]
[Display(Name="Module ID")]
public string ModuleID { get; set; }

[Required]
[StringLength(100)]
[Display(Name="Module Name")]
public string ModuleName { get; set; }

//To populate dropdownlist 
public List<SelectListItem> ModuleLevelList { get; set; }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接