2012-06-01 99 views
4

我設計一個新網站,ASP.NET MVC 4(測試版),VS 11(測試版),EF 5(測試版),但這個問題西服ASP的發行版本.NET MVC 3,VS 2010,EF 4。資料驗證模型/視圖模型/實體框架代碼優先

第一步:我使用實體框架代碼優先的方法,例如,我有以下的用戶模型:現在

public class User 
{ 
    [Key] 
    public int UserId {get;set;} 

    public String LoginName { get; set; } 

    public String Password { get; set; } 
} 

,註冊,我需要另一種模式,註冊模式:

public class Registration 
{ 
    public String LoginName { get; set; } 

    public String Password { get; set; } 

    public String PasswordConfirm { get; set; } 
} 

這是我的問題開始:我應該在哪裏把我的資料驗證註解?例如,密碼長度不得超過10個字符,並且PasswordConfirmed必須與密碼匹配等。我必須寫在每一個模型,它可以做密碼的東西(我想有ChangePassword模型,太)

的另一件事是如何處理的控制器。當我顯示我的Registration ViewModel並且一切正常時,我是否創建一個User模型並將Registration ViewModel中的變量賦值給它?

有時候,我有很多哪去了數據庫的性能,但不向用戶顯示(外鍵的計算值,等等)。

因爲想幹DRY,我不想重複我的自我。

這個最好的做法是什麼?

需要明確的是:註解是不是需要。如果有更好的方法來驗證,我會很高興,如果你給他們看。

回答

2

我不能客觀地說什麼是'最好的做法',但這裏是我的看法。 如果你綁定到視圖模型,驗證視圖模型,所以:

public class Registration 
{ 

    public String LoginName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String Password { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String PasswordConfirm { get; set; } 
} 

您可以在控制器做驗證「手」,在POST檢查密碼和確認密碼相匹配,如果不添加到ModelState中的條目(但可能導致代碼的重複,是有點麻煩),或使用漂亮IValidatableObject接口型號:

public class Registration : IValidatableObject 
{ 

    public String LoginName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String Password { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String PasswordConfirm { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext context) 
    { 
     if(Password != PasswordConfirm) 
      yield return new ValidationResult("Confirmation doesn't match", new[] {"PasswordConfirm"}) 
     //etc. 
    } 
} 

現在用的是,當你有你的模型POST後的約束,驗證通過簡單地調用ModelState.IsValid完成如果它無效,它會返回錯誤列表 - 包括您的自定義錯誤。

現在,當然你也可以把DataAnnotations的DB-模型也作爲額外的措施,只是「萬一」,避免字符串截斷異常等。如果你不知怎的忘記了,試圖將一個較長的字符串推到數據庫

至於映射,是的,在你的模型驗證後,在POST行動結束時,你通常會將屬性從模型映射到要麼是新的User實例(當添加到數據庫時),要麼到現有的實例進行更新。你可以使用AutoMapper或者使用反射自己寫一個天真的映射器 - 這是一個相對容易的任務,但將它作爲一個獨立的練習可能會更好,但重新發明輪子沒有意義。

1

您應該只在域圖層中創建實體。但是,如果您需要一些DataValidation註釋,您可以使用MvcExtensions。如果你有一些複合或嵌套實體,並且你想讓它們變成扁平物體,你應該使用automapper。這對你來說是一個最佳實踐!

+0

嗯,我不需要註釋。我也可以使用其他的做法 –

相關問題