Как установить значение для параметра по умолчанию с помощью Html.DropDownList

Я использую ASP MVC RC1.

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

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%>

Однако при рендеринге я получаю вот что.

<select id="areaid" name="areaid">
   <option value="">Select Area Id</option>
   <option value="1">Home</option>
   ...
</select> 

Я бы хотел, чтобы параметр Select Area Id имел значение 0 и отмечал его как выбранный по умолчанию, чтобы он согласовывался с другими значениями, и я мог проверить, была ли выбрана область, поскольку она является обязательной. ценить. AreaId является целым числом, поэтому, когда я сейчас щелкаю форму, не касаясь раскрывающегося списка, MVC жалуется, что "" не является целым числом, и выдает ошибку привязки.

Итак, как мне установить значение для параметра по умолчанию, а затем выбрать его в форме?

Спасибо, Дэн

Ответов (4)

Решение

Я думаю, у вас есть три- четыре варианта. Сначала, когда вы создаете свой SelectList или перечислимый SelectItemList, добавьте к выбору метку параметра и значение по умолчанию. Помещение его вверху сделает его значением по умолчанию, если какое-либо другое значение еще не выбрано в модели. Во-вторых, вы можете создать выбор (и параметры) «вручную» в представлении, используя цикл для создания параметров. Опять же, добавление вашего выбора по умолчанию, если он не входит в комплект поставки модели. В-третьих, используйте расширение DropDownList, но измените значение первого параметра с помощью javascript после загрузки страницы.

Кажется невозможным использовать расширение DropDownList для присвоения значения optionLabel, поскольку оно жестко запрограммировано для использования string.Empty . Ниже приведен соответствующий фрагмент кода с http://www.codeplex.com/aspnet .

    // Make optionLabel the first item that gets rendered.
    if (optionLabel != null) {
        listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false }));
    }

РЕДАКТИРОВАТЬ : Наконец, лучший способ - сделать так, чтобы ваша модель приняла значение Nullable и пометила его, как требуется, с помощью RequiredAttribute. Я бы рекомендовал использовать для представления модель, специфичную для представления, а не модель сущности. Поскольку значение имеет значение Nullable, пустая строка будет работать нормально, если будет отправлена ​​обратно без выбора значения. Установка его в качестве обязательного значения приведет к сбою проверки модели с соответствующим сообщением о том, что это значение требуется. Это позволит вам использовать помощник DropdownList как есть.

public AreaViewModel
{
    [Required]
    public int? AreaId { get; set; }

    public IEnumerable<SelectListItem> Areas { get; set; }
    ...
}

@Html.DropDownListFor( model => model.AreaId, Model.Areas, "Select Area Id" )

Для MVC3 SelectList имеет перегрузку, с помощью которой вы можете определить выбранное значение.

Function Create() As ViewResult

        ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1)

        Return View()

    End Function

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

Я хотел использовать один и тот же SelectList для нескольких раскрывающихся списков и не хотел дублировать SelectList в модели, поэтому я просто добавил новый метод расширения Html, который принимает значение и устанавливает выбранный элемент.

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes)
{
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value});
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes);
}

Вместо того, чтобы передавать элемент по умолчанию из определения в представлении, вы можете добавить данные «Выбрать область» в 0-й индекс списка из контроллера.

Таким образом, данные Select Area имеют индексное значение 0.