mvc3 DropDown для проверки не для вложенного свойства - PullRequest
0 голосов
/ 08 марта 2012

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

В моем контроллере я настроил модель представления для передачи. Заполнение не является проблемой. Вот простые версии моделей.

public class PersonViewModel
{
 public Person Person { get; set;}

 public List<Car> Cars { get; set;}
}

public class Car
{
 [Key]
 public int CarId { get; set;}
 [Required]
 public string Name { get; set;}
}

public class Person
{
 [Key]
 public int PersonId { get; set;}
 [Required]
 public int CarId { get; set;}
 [Required]
 public string FullName { get; set;}
}

Хорошо, пока довольно просто. По мнению это проблема.

По виду:

@model PersonViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Add Person</legend>

    <div class="editor-label">Car</div>
    <div class="editor-field">
        @Html.DropDownListFor(
            m => m.Person.CarId,
            new SelectList(
                Model.Cars,
                "CarId",
                "Name",
                0
            ),
            "-- Select A Car --"
        )
        @Html.ValidationMessageFor(m=> m.Person.CarId)
    </div>
    <div class="editor-label">
        @Html.LabelFor(m=> m.Person.FullName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Person.FullName)
        @Html.ValidationMessageFor(model => model.Person.FullName)
    </div>

    <p>
        <input type="submit" value="Create Person" />
    </p>
</fieldset>
}

Когда это представление отображается, создается форма для создания человека. В форме генерируется выпадающий список с именами автомобилей, и доступно поле имени человека. Если выбрана машина и введено имя человека, нажимается кнопка «Создать», сообщение проходит без проблем.

Однако здесь есть расхождение. Если имя человека не заполнено и нажата кнопка «Создать», поле ввода выделяется красным цветом с сообщением о том, что имя необходимо. Если автомобиль не выбран, то форму отправят. В контроллере это легко поймать под if(ModelState.isValid), но я бы хотел указать пользователю, что у его персоны нет машины. Добавление поля [Required] public int CarId к модели представления и последующая ссылка на него с помощью привязки остановит отправку формы, если автомобиль не выбран, но, похоже, является хакерским решением.

Причина, по которой проверка не проверяется, заключается в том, что по какой-то причине в сгенерированном <select> html-объекте отсутствует добавленное оформление class="input-validation-error" data-val-required="The field is required." data-val-number="The field must be a number." data-val="true".

Как я могу убедиться, что это украшение включено?

1 Ответ

1 голос
/ 08 марта 2012

Полагаю, что DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes как-то установлено на false.Это означает, что атрибут Required не будет автоматически добавляться для типов значений, таких как целые числа.Если вы установите значение true, обязательный атрибут будет автоматически добавлен в метаданные всех типов значений, а атрибуты HTML5 data-* будут отправлены.По умолчанию используется значение true.

Чтобы избежать подобных проблем, вы можете использовать реальную модель представления:

public class CreatePersonViewModel
{
    public PersonViewModel Person { get; set;}
    public List<CarViewModel> Cars { get; set;}
}

public class CarViewModel
{
    public int CarId { get; set;}

    public string Name { get; set;}
}

public class PersonViewModel
{
    [Required]
    public int? CarId { get; set;}

    [Required]
    public string FullName { get; set;}
}

Обратите внимание, что нам больше не нужно свойство PersonId для этого представления.модель, так как мы создаем нового человека, которому еще не присвоен идентификатор.Также обратите внимание, что CarId объявлен как обнуляемое целое число и украшен атрибутом Required.Поскольку в нашем раскрывающемся списке мы допускаем значение по умолчанию (-- Select A Car --), мы должны должным образом отразить это в модели представления, используя обнуляемый тип.

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