2011-06-29 116 views
6

例如,我有一個Employee視圖模型。創建員工時,我想驗證用戶名以確保它不存在。在MVC中創建自定義數據註釋驗證3

public class EmployeeViewModel 
{ 
    [ScaffoldColumn(false)] 
    public int EmployeeId { get; set; } 

    [ValidateDuplicate(ErrorMessage = "That username already exists")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 
} 

然後讓我的ValidateDuplicate函數與代碼一起檢查重複。

這可能嗎?

回答

14

我會建議看看remote validation.這個例子甚至與你的情況相符。

基本上,遠程屬性您的視圖模型的屬性,點添加到一個控制器動作

[Remote("IsUserExists", "Account", ErrorMessage = "Can't add what already exists!")] 
[Required(ErrorMessage = "Username is required")] 
[DisplayName("Username")] 
public string Username { get; set; } 

它確實工作

public ActionResult IsUserExists(string userName) 
{ 
if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName)) 
{ 
     return "Ok."; 
} 
} 
+2

這是賓果遊戲! – Steven

+0

鏈接被破壞 – sohtimsso1970

+1

David Hayden將他的博客遷移到其他地方,似乎他沒有將他的舊博客文章(或不能)撤回。話雖如此,這裏直接鏈接到微軟的文檔:http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx – Khepri

0

您可以通過擴展調用ValidateDuplicate的Attribute類來做到這一點。我會避免這樣做,因爲它只是另一個可能需要調用數據庫的地方。

2

您可以按照解釋here來編寫自己的自定義驗證。我修改了代碼以在模型中添加驗證,因爲我更喜歡模型中的rails活動記錄的驗證樣式。

public class EmployeeViewModel 
{ 

    [CustomValidation(typeof(EmployeeViewModel), "ValidateDuplicate")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 

    public static ValidationResult ValidateDuplicate(string username) 
    { 
     bool isValid; 

     using(var db = new YourContextName) { 
     if(db.EmployeeViewModel.Where(e => e.Username.Equals(username)).Count() > 0) 
     { 
      isValid = false; 
     } else { 
      isValid = true; 
     } 
     } 

     if (isValid) 
     { 
     return ValidationResult.Success; 
     } 
     else 
     { 
     return new ValidationResult("Username already exists"); 
     } 

    } 
}