Пользовательский атрибут проверки ASP MVC 5 для сравнения двух свойств?

У меня есть следующий настраиваемый атрибут проверки, чтобы проверить, не совпадают ли два свойства, но они применяются ко всей модели:

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

person adam78    schedule 06.08.2016    source источник
comment
вам придется использовать отражение. Лично я не думаю, что DataAnnotationAttributes должен выходить за рамки одного свойства. У вас может быть процедура проверки модели/представления для таких вещей. Но это только я.   -  person Jonesopolis    schedule 06.08.2016
comment
Рассмотрите возможность использования атрибута проверки защиты от дурака [NotEqualTo], применяемого к вашим ресурсам. В противном случае вы можете создать свой собственный — см. Полное руководство по проверке в ASP.NET MVC 3 — часть 2 за хорошее руководство   -  person    schedule 08.08.2016


Ответы (1)


Существует еще один возможный способ проверки значений свойств — использовать атрибут Remote.

В классе Model

 [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);
}

Рабочая демонстрация здесь

person mmushtaq    schedule 06.08.2016