繁体   English   中英

在 MVC 3 中创建自定义数据注释验证

[英]Creating custom data annotation validation in MVC 3

例如,我有一个员工视图 model。 创建员工时,我想验证用户名以确保它不存在。

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 function 与代码一起检查是否重复。

这可能吗?

我建议查看远程验证。 该示例甚至与您的情况相匹配。

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

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

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

    }
}

是的,这是可能的。 您需要编写自己的验证属性

您可以通过扩展属性 class 来实现,将其称为 ValidateDuplicate。 我会避免这样做,因为它只是您可能需要调用数据库的另一个地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM