Условная аннотация данных - PullRequest
21 голосов
/ 23 июня 2011

Есть ли способ сделать аннотацию данных условной?У меня есть таблица Party, где я храню как организации, так и людей.Если я добавляю организацию, я не хочу, чтобы поле фамилия было обязательным, но только если я добавляю человека.

public class Party
{
    [Required(ErrorMessage = "{0} is missing")]
    [DisplayName("Your surname")]
    public object surname { get; set; }

    [DisplayName("Type")]
    public object party_type { get; set; }
    ...
}  

Я бы хотел условиедля требуемой аннотации данных фамилии, например:
if (party_type=='P'), тогда требуется фамилия, иначе фамилия может быть пустой.

РЕДАКТИРОВАТЬ
Если мне нужно перенести эту проверку в контроллер, как бы я это сделал там?Как я могу вызвать такое же сообщение об ошибке оттуда?

Ответы [ 3 ]

32 голосов
/ 23 июня 2011

Вы можете сделать вашу модель наследуемой от IValidatableObject , а затем поместить свою пользовательскую логику в метод Validate.Вам также необходимо удалить атрибут RequredAttribute из свойства.Вам придется написать некоторый пользовательский javascript для проверки этого правила на клиенте, поскольку метод Validate не переводится в ненавязчивую структуру проверки.Примечание. Я изменил ваши свойства на строки, чтобы избежать приведения.

Кроме того, если у вас есть другие ошибки проверки из атрибутов, они сначала сработают и не позволят запустить метод Validate, поэтому вы обнаружите эти ошибки только в том случае, если атрибут -на основе проверки в порядке.

public class Party : IValidatableObject
{
    [DisplayName("Your surname")]
    public string surname { get; set; }

    [DisplayName("Type")]
    public string party_type { get; set; }
    ...

    public IEnumerable<ValidationResult> Validate( ValidationContext context )
    {
         if (party_type == "P" && string.IsNullOrWhitespace(surname))
         {
              yield return new ValidationResult("Surname is required unless the party is for an organization" );
         }
    }
}

На клиенте вы можете сделать что-то вроде:

 <script type="text/javascript">
 $(function() {
      var validator = $('form').validate();
      validator.rules('add', {
          'surname': {
              required: {
                 depends: function(element) {
                      return $('[name=party_type]').val() == 'P';
                 }
              },
              messages: {
                  required: 'Surname is required unless the party is for an organization.'
              }
           }
      });
 });
 </script>
3 голосов
/ 10 декабря 2013

Я знаю, что у этой темы есть время, но если вы хотите использовать для этого только декларативную проверку, вы можете просто использовать такую ​​простую конструкцию (дополнительные возможности см. В этой ссылке ):

[RequiredIf(DependentProperty = "party_type", TargetValue = "P")]
public string surname { get; set; }

public string party_type { get; set; }

Обновление:

Начиная с ExpressiveAnnotations 2.0, произошли серьезные изменения.Теперь то же самое можно сделать более простым способом:

[RequiredIf("party_type == 'P'")]
public string surname { get; set; }
0 голосов
/ 26 октября 2013

В контроллере вы можете проверить так: До, если (ModelState.IsValid)

if (model.party_type == 'p')
{
   this.ModelState.Remove("surname");
}
...