2011-06-29 66 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"); 
     } 

    } 
}