ASP.NET MVC DropDownListFor с моделью типа Список <строкa>
У меня есть представление с моделью типа List<string>
, и я хочу разместить раскрывающийся список на странице, которая содержит все строки из списка в качестве элементов в раскрывающемся списке. Я новичок в MVC, как мне это сделать?
Я попробовал это:
@model List<string>
@Html.DropDownListFor(x => x)
но это бросило ошибку.
Ответы
Ответ 1
Чтобы создать раскрывающийся список, вам нужно два свойства:
- свойство, к которому вы привязываетесь (обычно это скалярное свойство типа integer или string)
- список элементов, содержащих два свойства (один для значений и один для текста)
В вашем случае у вас есть только список строк, которые нельзя использовать для создания раскрывающегося списка для использования.
В то время как для номера 2. вы можете иметь значение, а текст - то же самое, что вам нужно для привязки свойства. Вы можете использовать слабо типизированную версию помощника:
@model List<string>
@Html.DropDownList(
"Foo",
new SelectList(
Model.Select(x => new { Value = x, Text = x }),
"Value",
"Text"
)
)
где Foo
будет именем ddl и использоваться связующим устройством по умолчанию. Таким образом, сгенерированная разметка может выглядеть примерно так:
<select name="Foo" id="Foo">
<option value="item 1">item 1</option>
<option value="item 2">item 2</option>
<option value="item 3">item 3</option>
...
</select>
Говорят, что более удаленная модель обзора для раскрывающегося списка выглядит следующим образом:
public class MyListModel
{
public string SelectedItemId { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
а затем:
@model MyListModel
@Html.DropDownListFor(
x => x.SelectedItemId,
new SelectList(Model.Items, "Value", "Text")
)
и если вы хотите предварительно выбрать какой-либо параметр в этом списке, вам нужно установить свойство SelectedItemId
этой модели представления в соответствующий Value
какой-либо элемент в коллекции Items
.
Ответ 2
Если у вас есть список типа строки, который вы хотите в раскрывающемся списке, я делаю следующее:
ОБНОВЛЕНИЕ: Уточнено, что делает его более полным примером.
public class ShipDirectory
{
public string ShipDirectoryName { get; set; }
public List<string> ShipNames { get; set; }
}
ShipDirectory myShipDirectory = new ShipDirectory()
{
ShipDirectoryName = "Incomming Vessels",
ShipNames = new List<string>(){"A", "A B", "A B C"},
}
myShipDirectory.ShipNames.Add("Aunt Bessy");
@Html.DropDownListFor(x => x.ShipNames, new SelectList(Model.ShipNames), "Select a Ship...", new { @style = "width:500px" })
Что дает раскрывающийся список примерно так:
<select id="ShipNames" name="ShipNames" style="width:500px">
<option value="">Select a Ship...</option>
<option>A</option>
<option>A B</option>
<option>A B C</option>
</select>
Чтобы получить значение на пост контроллера; если вы используете модель (например, MyViewModel), у которой в качестве свойства указан список строк, потому что вы указали x => x.ShipNames, вы просто используете сигнатуру метода как (потому что она будет сериализована/десериализована в модели):
public ActionResult MyActionName(MyViewModel model)
Если вы просто хотите получить доступ к раскрывающемуся списку поста, тогда подпись будет выглядеть так:
public ActionResult MyActionName(string ShipNames)
Ответ 3
Я понимаю, что этот вопрос задавали давным-давно, но я пришел сюда в поисках ответов и не был удовлетворен тем, что я мог найти. Я наконец нашел ответ здесь:
https://www.tutorialsteacher.com/mvc/htmlhelper-dropdownlist-dropdownlistfor
Чтобы получить результаты из формы, используйте FormCollection, а затем извлеките каждое отдельное значение по названию модели следующим образом:
yourRecord.FieldName = Request.Form["FieldNameInModel"];
Насколько я могу судить, абсолютно не имеет значения, какое имя аргумента вы даете FormCollection - используйте Request.Form ["NameFromModel"], чтобы получить его.
Нет, я не копался, чтобы увидеть, как магия работает под одеялом. Я просто знаю, что это работает...
Я надеюсь, что это поможет кому-то избежать тех часов, которые я потратил, пробуя разные подходы, прежде чем я начал работать.