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

ASP.NET MVC DropDownListFor с моделью типа Список <строкa>

У меня есть представление с моделью типа List<string>, и я хочу разместить раскрывающийся список на странице, которая содержит все строки из списка в качестве элементов в раскрывающемся списке. Я новичок в MVC, как мне это сделать?

Я попробовал это:

@model List<string>
@Html.DropDownListFor(x => x)

но это бросило ошибку.

4b9b3361

Ответ 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"], чтобы получить его.

Нет, я не копался, чтобы увидеть, как магия работает под одеялом. Я просто знаю, что это работает...

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