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

У меня проблемы с моим приложением 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; }

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

Ответы [ 4 ]

23 голосов
/ 23 ноября 2011

Вы можете реализовать 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 type="text/javascript">
$(function() {
    $('form').validate(); 
    $('form').rules('add', { 
        "ContactPhoneNumber": { 
            depends: function(el) { return !$('#ContactEmailAddress').val(); } 
        } 
    });
});
</script>
15 голосов
/ 18 мая 2014

Условная проверка на основе аннотации может быть определена с помощью 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; }
1 голос
/ 23 марта 2012

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

1 голос
/ 23 ноября 2011

Вот запись в блоге MSDN об условных проверках: http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...