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

时间:2016-12-05 17:45:25

标签: c# asp.net-mvc

我有一个包含基本信息的model。但是,我的View需要更多信息才能显示,因此我认为此处需要ViewModel来显示这些额外信息。但是,我应该在模型中添加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; }

}

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我强烈建议您使用视图模型。你可能认为它现在是多余的,但我向你保证它非常有用,你会感谢我。过去我曾多次被烧毁,试图在任何地方使用模型对象并严重依赖像你这样的数据注释。另外,您不必使用视图图层垃圾(例如[显示(名称=&#34;模块名称&#34;))来丢弃您的模型图层。

在你的情况下,我建议:

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

}