2016-12-05 71 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