Как создать статическое выпадающее меню в синтаксисе Razor?

После нескольких часов поиска в Google и переполнении стека я не могу найти один кровавый пример того, как создать полный раскрывающийся список полностью мертвого мозга, который не поступает из базы данных. Честно говоря, мне тяжело ловить голову вокруг MVC. Может кто-нибудь, пожалуйста, покажите мне, как это сделать:

<select name="FooBarDropDown" id="FooBarDropDown">
    <option value="Option1" selected>This is Option 1</option>
    <option value="Option2">This is Option 2</option>
    <option value="Option3">This is Option 3</option>
</select>

Используя это:

@Html.DropDownList....

Я ищу решение "все-в-одном"... все в представлении. У меня есть дьявол времени с синтаксисом.

Ответ 1

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

@Html.DropDownList("FooBarDropDown", new List<SelectListItem>
{
    new SelectListItem{ Text="Option 1", Value = "1" },
    new SelectListItem{ Text="Option 2", Value = "2" },
    new SelectListItem{ Text="Option 3", Value = "3" },
 } 

Пример размещения этого в контроллере может выглядеть так:

public ActionResult ExampleView()
{
    var list = new List<SelectListItem>
    {
        new SelectListItem{ Text="Option 1", Value = "1" },
        new SelectListItem{ Text="Option 2", Value = "2" },
        new SelectListItem{ Text="Option 3", Value = "3", Selected = true },
    }); 

    ViewData["foorBarList"] = list;
    return View();
}

И тогда, по вашему мнению:

@Html.DropDownList("fooBarDropDown", ViewData["list"] as List<SelectListItem>)

Если это действительно статический список, который вам, возможно, придется использовать повторно в других представлениях/контроллерах, то я хотел бы рассмотреть возможность помещения этой логики в статический класс. Пример:

public static class DropDownListUtility
{   
    public static IEnumerable<SelectListItem> GetFooBarDropDown(object selectedValue)
    {
        return new List<SelectListItem>
        {
            new SelectListItem{ Text="Option 1", Value = "1", Selected = "1" == selectedValue.ToString()},
            new SelectListItem{ Text="Option 2", Value = "2", Selected = "2" == selectedValue.ToString()},
            new SelectListItem{ Text="Option 3", Value = "3", Selected = "3" == selectedValue.ToString()},
        };             
    }

Что затем оставляет вам несколько разных способов доступа к списку.

Пример контроллера:

public ActionResult ExampleView()
{
    var list = DropDownListUtility.GetFooBarDropDown("2"); //select second option by default;
    ViewData["foorBarList"] = list;
    return View();
}

Посмотреть пример:

@Html.DropDownList("fooBarDropDown", DropDownListUtility.GetFooBarDropDown("2"))

Ответ 2

Посмотрите документы для этой перегрузки

public static MvcHtmlString DropDownList(
  this HtmlHelper htmlHelper,
  string name,
  IEnumerable<SelectListItem> selectList
)

Поэтому просто добавьте ссылку на свой List<SelectListItem>() с вашими параметрами.

List<SelectListItem> items = new List<SelectListItem>();
 items.Add(new SelectListItem { Text = "Option1", Value = "Option1"});
 items.Add(new SelectListItem { Text = "Option2", Value = "Option2" });
 items.Add(new SelectListItem { Text = "Option3", Value = "Option3", Selected = true });

Вы можете даже вставить это в свое мнение, если вы не хотите передавать его с вашего контроллера.

@{
    List<SelectListItem> items = ...
}

Затем используйте его

@Html.DropDownList("FooBarDropDown", items)