Creating custom data annotation validation in MVC 3

前端 未结 4 946
说谎
说谎 2020-12-16 05:15

For instance, I have an Employee view model. When creating an employee, I want to validate the username to make sure it doesn\'t exist.

public class Employee         


        
相关标签:
4条回答
  • 2020-12-16 05:19

    I would suggest looking at remote validation. The example even matches your case.

    Basically, add the remote attribute to your viewmodel property that points to a controller action

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

    which does your work

    public ActionResult IsUserExists(string userName) 
    {
     if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName))
     {
          return "Ok.";
     }
    }
    
    0 讨论(0)
  • 2020-12-16 05:36

    You can do that by extending the Attribute class calling it ValidateDuplicate. I'd avoid doing it this way because its just another place where you potentially have to make a call to a database.

    0 讨论(0)
  • 2020-12-16 05:37

    You can write your own custom validation as explained here. I've modified the code to add validation in the model as I prefer rails active record's validation style in the model.

    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");
          }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-16 05:39

    Yes, it's possible. You'll need to write your own validation attribute.

    0 讨论(0)
提交回复
热议问题