Проверка модели /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; }
Должен ли я создать настраиваемый атрибут для проверки моей модели, и если да, то как мне это достичь?
Ответы
Ответ 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; }
Ответ 3
Вот запись в блоге MSDN об условных проверках: http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx
Ответ 4
Я знаю, что у вас уже есть решение, но у меня была аналогичная ситуация, поэтому, возможно, мое решение окажется полезным для кого-то другого. Я применил пользовательский атрибут с проверкой на стороне клиента. Вот мой пост в блоге: http://hobbscene.com/2011/10/22/conditional-validation/