C# 在MVC 3中创建自定义数据注释验证
例如,我有一个雇员视图模型。创建员工时,我想验证用户名,以确保它不存在C# 在MVC 3中创建自定义数据注释验证,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,例如,我有一个雇员视图模型。创建员工时,我想验证用户名,以确保它不存在 public class EmployeeViewModel { [ScaffoldColumn(false)] public int EmployeeId { get; set; } [ValidateDuplicate(ErrorMessage = "That username already exists")] [Required(ErrorMessage = "Username is
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函数与代码一起检查是否存在重复
这可能吗?我建议看一看与您的案例相匹配的示例 基本上,将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.";
}
}
是的,有可能。您需要。可以通过扩展名为ValidateDuplicate的属性类来实现这一点。我会避免这样做,因为这只是另一个可能需要调用数据库的地方 如前所述,您可以编写自己的自定义验证。我修改了代码以在模型中添加验证,因为我更喜欢模型中rails活动记录的验证样式
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");
}
}
}
大卫·海登(David Hayden)将他的博客迁移到了其他地方,似乎他没有(或不能)移植回他的旧博客帖子。尽管如此,这里有一个直接指向Microsoft文档的链接: