【问题标题】:ASP MVC 5 Custom Validation Attribute to Compare Two Properties?ASP MVC 5 自定义验证属性来比较两个属性?
【发布时间】:2016-12-12 21:45:18
【问题描述】:

我有以下自定义验证属性来检查两个属性是否不相同但它应用于整个模型:

[AttributeUsage(AttributeTargets.Class)]
public class ValidateUser : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        UserViewModel user = value as UserViewModel;
        if(user.UserId == user.ManagerId)
        {
            ErrorMessage = "The user and manager cannot be the same";
            return false;
        }
        return true;

    }
}

[ValidateUser]
public class UserViewModel
{
   [DisplayName("Request By")]
   public string UserId { get; set; }

   [DisplayName("Assign To")]
   public string ManagerId { get; set; }
}

我如何创建一个验证属性,这样我就可以装饰需要验证的属性,而不是装饰整个视图模型,以便错误消息显示在正在验证的字段附近。如下所示:

   [DisplayName("Request By")]
   [ValidateUser]
   public string UserId { get; set; }

   [DisplayName("Assign To")]
   [ValidateUser]
   public string ManagerId { get; set; }

【问题讨论】:

  • 你必须使用反射。就我个人而言,我不认为 DataAnnotationAttributes 应该扩展到单个属性的范围之外。您可以在模型/视图模型上对此类事情进行验证。但这只是我。
  • 考虑使用foolproof [NotEqualTo] 验证属性应用于您的属性。否则,您可以创建自己的 - 请参阅 The Complete Guide To Validation In ASP.NET MVC 3 - Part 2 以获得良好的指导

标签: c# asp.net-mvc validation customvalidator validationattribute


【解决方案1】:

验证属性值的另一种可能方法是使用Remote 属性

在您的模型类中

 [DisplayName("Request By")]
 public string UserId { get; set; }


 [DisplayName("Assign To")]
 [Remote("Validate","Home", HttpMethod="Post", AdditionalFields="UserId", ErrorMessage = "Should not be same")]
       public string ManagerId { get; set; }

在您的控制器中

[HttpPost]
public ActionResult Validate(string ManagerId , string UserId )
{
  // put some validation involving ManagerId and UserId here
  return Json(true);
}

Working Demo is here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多