2013-04-19 2 views
5

Я использую композитный тип для поля в модели.Как применить обязательный атрибут на составной модели?

У меня есть поле в моей модели по имени PersonDetails

public Phone PhoneDetails{get;set;} 

Телефон еще одна модель, содержащая три другие поля

int MobilePhone; 
int WorkPhone; 
int HomePhone; 

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

public String Name{get;set;} 
public Phone PhoneDetails{get;set;} 
public string Address{get;set;} 

я могу применить Required атрибут поля для остальных полей, но я хочу, чтобы применить Required атрибут PhoneDetails поля. Условие состоит в том, что по крайней мере один из трех, т. Е. Мобильного телефона, рабочего телефона или домашнего телефона, должен иметь значение.

Как я могу решить эту проблему?

+1

no, вы не можете применять аннотацию 'required' к сложным объектам. То есть, вы можете, но это не будет применяться. Вы можете применить аннотацию 'required' к каждому правилу ... –

+0

@DaveA: Есть ли какой-либо подход, который будет работать для этой атаки. –

+0

@DaveA: Обязательное сообщение проверки поля должно быть запущено, если все три поля пустые. Я попытался решить эту проблему, используя также выборочную проверку, но не преуспел. Не могли бы вы посоветовать мне об этом? –

ответ

2

Один из подходов к реализации IValidatableObject:

public class PersonDetails : IValidatableObject 
{ 
    public string Name { get; set; } 
    public Phone PhoneDetails { get; set; } 
    public string Address { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (PhoneDetails.MobilePhone == 0 && PhoneDetails.WorkPhone == 0 && PhoneDetails.HomePhone == 0) 
      yield return new ValidationResult("Please enter at least 1 phone number", new[] { "PhoneDetails" }); 
    } 
} 

Ваша форма будет показывать «Пожалуйста, введите по крайней мере 1 номер телефона», если никто не вошел.

+0

Я применил выше изменений, но у него есть одна проблема. Он дает ошибку времени выполнения, показывающую «Добавить параметр проверки компонентов ComponentModel.DataAnnotations» во все места, где модель PhoneDetails используется в других проектах. –

+0

Да - вам нужно будет ссылаться на ComponentModel.DataAnnotations, поскольку я считаю, что интерфейс находится в этой библиотеке. Это проблема? –

0

Для этого типа проверки я всегда использую FluentValidation.

Это позволяет гораздо более сложные сценарии проверки, чем атрибуты/аннотации и очень совместимы с MVC (и все .NET-код в целом)

Используйте NuGet, чтобы добавить его в свой проект - множество примеров и документации доступный.

Смежные вопросы