【问题标题】:Creating custom data annotation validation in MVC 3在 MVC 3 中创建自定义数据注释验证
【发布时间】:2023-03-03 03:48:03
【问题描述】:

例如,我有一个 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 函数与代码一起检查是否重复。

这可能吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我建议查看remote validation. 该示例甚至与您的情况相匹配。

    基本上,将远程属性添加到指向控制器操作的视图模型属性

    [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.";
     }
    }
    

    【讨论】:

    【解决方案2】:

    是的,这是可能的。你需要write your own validation attribute

    【讨论】:

      【解决方案3】:

      您可以按照here 的说明编写自己的自定义验证。我修改了代码以在模型中添加验证,因为我更喜欢模型中的 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");
            }
      
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以通过扩展名为 ValidateDuplicate 的 Attribute 类来做到这一点。我会避免这样做,因为它只是另一个可能需要调用数据库的地方。

        【讨论】:

          猜你喜欢
          • 2012-07-13
          • 1970-01-01
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-14
          相关资源
          最近更新 更多