Подтвердить что ты не робот

Проверка модели /ASP.NET MVC 3 - Условный обязательный атрибут

У меня возникают проблемы с моим приложением ASP.NET MVC 3. У меня есть 2 свойства в моей модели, поэтому я хочу, чтобы только 1 из них требовался в моем представлении на основе того, что пустое. Например, если я ввожу номер телефона, тогда письмо больше не требуется, и наоборот, но если я оставлю оба пустым, то нужно либо 1, либо ниже, моя модель:

[Display(Name = "Contact Phone Number:")]
[MaxLength(150)]
public string ContactPhoneNumber { get; set; }

[Display(Name = "Contact Email Address:")]
[MaxLength(100)]
public string ContactEmailAddress { get; set; }

Должен ли я создать настраиваемый атрибут для проверки моей модели, и если да, то как мне это достичь?

4b9b3361

Ответ 1

Вы можете реализовать IValidatableObject в своем классе и предоставить метод Validate(), который реализует вашу пользовательскую логику. Объедините это с пользовательской логикой проверки на клиенте, если вы предпочитаете, чтобы он был поставлен. Я нахожу это проще, чем реализация атрибута.

public class ContactModel : IValidatableObject
{
   ...

   public IEnumerable<ValidationResult> Validate( ValidationContext context )
   {
        if (string.IsNullOrWhitespace( ContactPhoneNumber ) 
            && string.IsNullOrWhitespace( ContactEmailAddress ))
        {
             yield return new ValidationResult( "Contact Phone Number or Email Address must be supplied.", new [] { "ContactPhoneNumber", "ContactEmailAddress" } );
        }
   }
}

Чтобы получить все, что работает на стороне клиента, вам нужно добавить к вашему представлению следующее script:

<script type="text/javascript">
$(function() {
    $('form').validate(); 
    $('form').rules('add', { 
        "ContactPhoneNumber": { 
            depends: function(el) { return !$('#ContactEmailAddress').val(); } 
        } 
    });
});
</script>

Ответ 2

условная валидация на основе аннотаций может быть определена с помощью ExpressiveAnnotations:

[RequiredIf("ContactPhoneNumber == null",
    ErrorMessage = "At least email or phone should be provided.")]
public string ContactEmailAddress { get; set; }

[RequiredIf("ContactEmailAddress == null",
    ErrorMessage = "At least email or phone should be provided.")]
public string ContactPhoneNumber { get; set; }

Ответ 4

Я знаю, что у вас уже есть решение, но у меня была аналогичная ситуация, поэтому, возможно, мое решение окажется полезным для кого-то другого. Я применил пользовательский атрибут с проверкой на стороне клиента. Вот мой пост в блоге: http://hobbscene.com/2011/10/22/conditional-validation/