在MVC 3中创建自定义数据注释验证

时间:2011-06-29 20:37:20

标签: c# asp.net asp.net-mvc asp.net-mvc-3

例如,我有一个Employee视图模型。在创建员工时,我想验证用户名以确保它不存在。

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函数的某处使用代码来检查重复。

这可能吗?

4 个答案:

答案 0 :(得分:15)

我建议查看remote validation.该示例甚至与您的案例相符。

基本上,将remote属性添加到指向控制器操作的viewmodel属性

[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.";
 }
}

答案 1 :(得分:2)

是的,这是可能的。您需要write your own validation attribute

答案 2 :(得分:2)

您可以按照here的说明编写自己的自定义验证。我修改了代码以在模型中添加验证,因为我更喜欢模型中的rails active record的验证样式。

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");
      }

    }
}

答案 3 :(得分:0)

您可以通过扩展Attribute类来调用它ValidateDuplicate来实现。我不会这样做,因为它只是你可能需要调用数据库的另一个地方。