Необязательный [Обязательный] для сложных типов - PullRequest
5 голосов
/ 17 января 2012

Я пытаюсь настроить мою модель представления для формы, которая будет собирать информацию о людях, вступающих в команду.Форма должна содержать некоторую начальную информацию, а затем список из 5 «членов команды» (каждый из которых содержит имя, адрес электронной почты и телефон), первые два из которых потребуются.Для моей проверки я хотел бы, чтобы это было на отдельных полях, например:

Person 1:
Name: (validation messaage)
Email: (validation message)
Phone: (validation message)

Person 2:
Name: (validation messaage)
Email: (validation message)
Phone: (validation message)

Person 3:
Name: 
Email:
Phone:

Person 4:
Name: 
Email:
Phone:

Person 5:
Name: 
Email: 
Phone: 

Соответствующая часть моей модели представления в настоящее время:

[Required]
public TeamMember TeamMember1 { get; set; }

[Required]
public TeamMember TeamMember2 { get; set; }

public TeamMember TeamMember3 { get; set; }

public TeamMember TeamMember4 { get; set; }

public TeamMember TeamMember5 { get; set; }

, поэтому, на мой взгляд, япросто напишите:

@Html.EditorFor(model=>model.TeamMember1)

@Html.EditorFor(model=>model.TeamMember2)

@Html.EditorFor(model=>model.TeamMember3)

@Html.EditorFor(model=>model.TeamMember4)

@Html.EditorFor(model=>model.TeamMember5)

шаблон редактора выглядит следующим образом:

@model MyProject.Models.TeamMember

<div class="editor-label">
    @Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>

<div class="editor-label">
    @Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Email)
    @Html.ValidationMessageFor(model => model.Email)
</div>

<div class="editor-label">
    @Html.LabelFor(model => model.Phone)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Phone)
    @Html.ValidationMessageFor(model => model.Phone)
</div>

Извините, что бросил так много в один поток, но есть ли у кого-нибудь предложения о том, как лучше установить этовверх?Я думал о наследовании от RequiredAttribute и замене [Required] в свойствах TeamMember, но я не уверен, как установить сообщения проверки для дочерних полей.Прямо сейчас, даже если он пустой, он проходит необходимую проверку, я предполагаю, потому что объекты связаны (и поэтому не нулевые), даже если все свойства не заполнены.

Любая обратная связь приветствуется.

1 Ответ

1 голос
/ 03 февраля 2012

Вы можете написать собственный валидатор.Ниже приведен пример того, как вы можете получить доступ к значениям других свойств.Затем вы можете украсить TeamMember или свойство с помощью этого пользовательского атрибута проверки в зависимости от логики проверки.Я бы порекомендовал это на уровне класса

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    //Retreive value of Name property
    var nameProperty = validationContext.ObjectType.GetProperty("Name");
    var namePropertyValue = (string)nameProperty.GetValue(validationContext.ObjectInstance, null);

    var propertyBeingValidatedValue = (string)value;

    //Validation logic
    if ((!string.IsNullOrEmpty(propertyBeingValidatedValue)) && (!string.IsNullOrEmpty(namePropertyValue)))
    {
        //returning null means everything is good.
        return null;
    }
    //return a message in any other case.
    return new ValidationResult("Validation Message");
}
...