Creating custom data annotation validation in MVC 3

13,030

Solution 1

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

Solution 2

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

Solution 3

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

    }
}
Share:
13,030
Steven
Author by

Steven

Updated on June 30, 2022

Comments

  • Steven
    Steven almost 2 years

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

    And then have my ValidateDuplicate function somewhere with the code to check for a duplicate.

    Is this possible?

  • Khepri
    Khepri about 11 years
    David Hayden migrated his blog to elsewhere and appears he did not port back his old blog posts (or couldn't). That being said, here's a link directly to Microsoft's documentation: msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx