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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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.";
}
}
Method 2
Yes, it’s possible. You’ll need to write your own validation attribute.
Method 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");
}
}
}
Method 4
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0