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文档的链接: