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");
}
}
}
Author by
Steven
Updated on June 30, 2022Comments
-
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 about 11 yearsDavid 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