Просмотр исходного кода ASP.NET MVC 2 показывает некоторые решения этой проблемы. По сути, любой SelectListItem
в SelectList
, передаваемый в вспомогательном методе расширения, у которого для свойства Selected
установлено значение true, не имеет никакого отношения к элементу <option>
, отображаемому с атрибутом selected
, примененным для элемента.
Атрибут selected
в <option>
элементах определяется
1) проверка того, что вспомогательный метод расширения был передан SelectList
. Если это значение равно null, платформа будет искать в ViewData значение, соответствующее ключу, являющемуся свойством модели представления, для которого вы хотите отобразить раскрывающийся список. Если значение равно SelectList
, оно будет использоваться для визуализации <select>
, включая принятие любых выбранных значений, при условии, что состояние модели для свойства модели равно нулю.
2) Если в методе расширения помощника передано SelectList
, а состояние модели для свойства модели равно нулю, каркас будет искать во ViewData значение по умолчанию, используя имя свойства модели в качестве ключа. Значение в данных представления преобразуется в строку, и любые элементы в SelectList
, переданные вспомогательному методу расширения, которые имеют значение (если значение не установлено, то текст будет проверен), соответствующее значению по умолчанию, будет иметь Selected
свойство установлено в значение true, которое, в свою очередь, будет отображать <option>
с атрибутом selected="selected"
.
Если сложить это вместе, есть две вероятные опции, которые я вижу, чтобы выбрать опцию и использовать строго типизированный DropDownListFor
:
Использование следующей модели представления
public class CategoriesViewModel
{
public string SelectedCategory { get; private set ; }
public ICollection<string> Categories { get; private set; }
public CategoriesViewModel(string selectedCategory, ICollection<string> categories)
{
SelectedCategory = selectedCategory;
Categories = categories;
}
}
Вариант 1
Установите значение в ViewData в контроллере, отображающем ваше представление в соответствии с именем свойства коллекции, используемой для отображения раскрывающегося списка
контроллер действия
public class CategoriesController
{
[HttpGet]
public ViewResult Select()
{
/* some code that gets data from a datasource to populate the view model */
ICollection<string> categories = repository.getCategoriesForUser();
string selectedCategory = repository.getUsersSelectedCategory();
CategoriesViewModel model = new CategoriesViewModel(selectedCategory, categories);
this.ViewData["Categories"] = selectedCategory;
return View(model);
}
[HttpPost]
public ActionResult Select(CategoriesViewModel model)
{
/* some code that does something */
}
}
и в строго типизированном виде
<%: Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c, Value = c }), new { @class = "my-css-class" }) %>
Вариант 2
Визуализация раскрывающегося списка с использованием имени свойства выбранного элемента (ов)
контроллер действия
public class CategoriesController
{
[HttpGet]
public ViewResult Select()
{
/* some code that gets data from a datasource to populate the view model */
ICollection<string> categories = repository.getCategoriesForUser();
string selectedCategory = repository.getUsersSelectedCategory();
CategoriesViewModel model = new CategoriesViewModel(selectedCategory, categories);
return View(model);
}
[HttpPost]
public ActionResult Select(CategoriesViewModel model)
{
/* some code that does something */
}
}
и в строго типизированном виде
<%: Html.DropDownListFor(m => m.SelectedCategory, Model.Categories.Select(c => new SelectListItem { Text = c, Value = c }), new { @class = "my-css-class" }) %>