例如,我有一个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函数的某处使用代码来检查重复。
这可能吗?
答案 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来实现。我不会这样做,因为它只是你可能需要调用数据库的另一个地方。