我有一个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在这种情况下我真的需要一个吗?
用于用户输入验证的数据注释属性在 ViewModel 上。实体框架代码的数据注释首先在模型上进行。
它们在概念上是两个不同的东西,使用 EF Code First 验证输入和生成数据库。
例如,Entity Framework Code First 的 Required 和 StringLength 创建了一个 varchar(length) NOT NULL 类型的数据库列。ViewModel 上的 Required 和 StringLength 用于验证用户输入。不要将两者混为一谈,两次使用 StringLength(length) 没有任何问题。如果您希望长度仅表示一个位置,请将长度值放在静态常量中。
我强烈建议您使用视图模型。您现在可能认为它是多余的,但我向您保证它非常有用,并且将来您会感谢我。过去,我曾多次尝试在任何地方使用模型对象并严重依赖数据注释,就像您一样。另外,您不必在模型层中乱扔视图层垃圾,例如 [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)