我有一个包含基本信息的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
吗?
答案 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; }
}