Подтвердить что ты не робот

Проверка требуемого выбора в DropDownList

Моя модель просмотра определяет свойство, которое должно отображаться как поле со списком. Определение свойства:

[Required]
public int Processor { get; set; }

Я использую DropDownListFor для отображения комбинированного поля:

<%=Html.DropDownListFor(r => r.Processor, Model.Processors, Model.Processor)%>

Model.Processors содержит IEnumerable<SelectListItem> с одним специальным элементом, определенным как:

var noSelection = new SelectListItem
  {
    Text = String.Empty,
    Value = "0"
  };

Теперь мне нужно добавить подтверждение в поле со списком, чтобы пользователь должен выбрать другое значение, а затем "noSelection". Я надеялся на некоторую конфигурацию RequiredAttribute, но у нее нет значения по умолчанию.

4b9b3361

Ответ 1

Как насчет этого:

[Required]
public int? Processor { get; set; }

И затем:

<%= Html.DropDownListFor(
    x => x.Processor, Model.Processors, "-- select processor --"
) %>

И в вашем действии POST

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    if (ModelState.IsValid)
    {
        // the model is valid => you can safely use model.Processor.Value here:
        int processor = model.Processor.Value;
        // TODO: do something with this value
    }
    ...
}

Теперь вам больше не нужно вручную добавлять элемент noSelection. Просто используйте надлежащую DropDownListFor перегрузку.

Ответ 2

Одна из возможных проблем заключается в том, что jQuery Validate выполняет запуск любых правил, если значение элемента пуст.

Вы можете обойти это с помощью повторной проверки валидации, когда пользователь теряет фокус:

// select statements not firing null validation automatically
$("select").blur(function () { $(this).valid() });