2016-12-05 97 views
1

我有一个model包含基本信息。然而,我View需要更多的信息,只是为了显示,所以我认为一个ViewModel这里需要显示额外的信息。但是,如果我在模型中添加Validation attributes这样,当我执行Code-First migration,它会自动创建database对我来说每列的正确datatype或者我应该添加Validation attributes到视图模型,因为形式应该validate所填写内容?ViewModel或Model中的ASP.NET MVC验证?

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

我想这是这两个办法... –

+0

'Module'类是实体类,它没有任何意义,把验证到它,你可以使用视图模型进行验证和其他的东西,以显示视图页面上,在你需要的话用您的视图模型类映射您的实体类。 –

+0

请注意,模型 - 视图 - 控制器标签用于解决该模式的问题。 ASP.NET-MVC实现有一个特定的标签。 –

回答

0

我强烈建议你使用一个视图模型。你现在可能认为这是多余的,但我向你保证它是非常有用的,你会感谢我。过去我被烧过很多次,试图在各处使用模型对象,并严重依赖像您这样的数据注释。另外,你不必垃圾与视图层垃圾模型层,如[显示(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; } 

} 
1

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

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

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

+1

谢谢您的反馈! – Pow4Pow5