Как установить значение для параметра по умолчанию с помощью 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)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);
}