ViewModel 或 Model 中的 ASP.NET MVC 验证?

Pow*_*ow5 4 c# asp.net-mvc

我有一个model包含基本信息的。但是,我View需要更多的信息只是为了显示,所以我认为ViewModel这里需要a来显示额外的信息。但是,我应该Validation attributes在模型中添加 ,以便当我执行时Code-First migration,它会自动database为我创建datatype每列正确的,还是我应该将 添加Validation attributes到 ViewModel 因为表单应该validate填写信息?

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; }

}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*den 5

用于用户输入验证的数据注释属性在 ViewModel 上。实体框架代码的数据注释首先在模型上进行。

它们在概念上是两个不同的东西,使用 EF Code First 验证输入和生成数据库。

例如,Entity Framework Code First 的 Required 和 StringLength 创建了一个 varchar(length) NOT NULL 类型的数据库列。ViewModel 上的 Required 和 StringLength 用于验证用户输入。不要将两者混为一谈,两次使用 StringLength(length) 没有任何问题。如果您希望长度仅表示一个位置,请将长度值放在静态常量中。


coo*_*les 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; }

}
Run Code Online (Sandbox Code Playgroud)