Как использовать MVC Html Helper .DropDownListFor <> с Enum - PullRequest
5 голосов
/ 27 мая 2011

В моем приложении MVC 3 Razor у меня есть Модель с перечислением ..

Пример модели:

public class EmployeeModel
{
 public enum Title
 {
  Accountant = 111,
  Sales = 222,
  Production = 333 
 }

 [Required]
 public string Name {get; set;}

 [Required]
 public Title JobTitle {get; set;}
}

В моем представлении я хотел бы использовать помощники HTML для создания формы HTML ...

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

@model ..Models.EmployeeModel

@using (Html.BeginForm())
{
 @Html.LabelFor(m => m.Name)
 @Html.TextBoxFor(m => m.Name)
 <br>

 @Html.LabelFor(m => m.JobTitle)
 @Html.DropDownListFor(m => m.JobTitle, ??How do I get Title enum values??)
 <br>

 <input type="submit />
}

Вывод DropDownListFor, который я пытаюсь достичь, будет выглядеть так: Обратите внимание, что значения параметров соответствуют инициализированным значениям перечисления

<select name="JobTitle">
 <option value="-1">Choose a Job Title</option>
 <option value="111">Accountant</option>
 <option value="222">Sales</option>
 <option value="333">Production</option>
</select>

Как мне получить помощник DropDownListFor <> для создания элемента select / option на основе перечисления Title модели?

Кроме того, возможно ли иметь помощник DropDownListFor <> для добавления дополнительного (не являющегося частью перечисления), аналогичного параметру «Выбрать должность» в приведенном выше примере?

Ответы [ 6 ]

3 голосов
/ 27 июля 2013

Вот решение

public enum Months
{
January=1,
February=2,
March=3,
April =4,
May=5,
June=6
}

public ActionResult Index()
{

ViewBag.Months = (from Months m in Enum.GetValues(typeof(Months))
                select new SelectListItem { Text = m.ToString(), Value = Convert.ToUInt16(m).ToString() });

return View();  
}

Добавить имя ViewBag в DropDownList:

<%=Html.DropDownList("Months") %>
3 голосов
/ 02 марта 2012

Я только что наткнулся на этот вопрос / ответ StackO - не только мой вопрос здесь является точной копией, но ответ , данный Майком Маклафлином , является лучшим решением, которое я видел для использования DropdownListFor<> с Enums. В частности, Майк указывает нам на решение, которое он нашел Морганом Леруа

Быстрое решение Моргана:

@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States))))

Но Морган сделал Расширение, которое делает реализацию DropDownListFor<> с перечислениями еще более компактной. Вы можете скачать Моргана Visual Studio Solution здесь.

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

3 голосов
/ 27 мая 2011

Вы могли бы получить String[] с именами значений перечисления и создать выпадающий список из этого. В вашей модели представления добавьте свойство Titles типа SelectListItem и добавьте к нему значения и имена перечислений. Вы можете получить имена и значения через тип System.Enum.

var defaultItem = new SelectListItem();
defaultItem.Value = -1;
defaultItem.Text = "Choose a title";
defaultItem.Selected = true;
model.TitleSelectItems.add(defaultItem);

String[] names = System.Enum.GetNames(typeof(Title));
Int[] values = System.Enum.GetValues(typeof(Title));

for (int i = 0; i<names.Length; i++)
{
    var item = new SelectListItem();
    item.Text = names[i];
    item.Value = values[i];
    model.TitleSelectItems.Add(item);
}

Это некрасиво, но это сработает.

2 голосов
/ 18 апреля 2013

Инкапсулированное расширение HTML Helper доступно здесь:

http://www.spicelogic.com/Journal/ASP-NET-MVC-DropDownListFor-Html-Helper-Enum-5

снимок исходного кода:

enter image description here

Вы можете скачатьполный исходный код проекта по ссылке.

2 голосов
/ 02 февраля 2012

Вот способ использования Html Helpers:

Модель

public class Person
{
    public string Name { get; set; }
    public JobTitle Job { get; set; }
    public enum JobTitle
    {
        Accountant = 111,
        Sales = 222,
        Production = 333
    }
}

Просмотр

@model MvcApplication1.Models.Person

@{
    ViewBag.Title = "Index";
}

@using (Html.BeginForm())
{
    @Html.TextBoxFor(n => n.Name)
    @Html.DropDownListFor(c => c.Job, new[]{
        new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Accountant.ToString(), 
            Value=((int)MvcApplication1.Models.Person.JobTitle.Accountant).ToString()}
        ,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Production.ToString(), 
            Value=((int)MvcApplication1.Models.Person.JobTitle.Production).ToString()}
        ,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Sales.ToString(),
            Value=((int)MvcApplication1.Models.Person.JobTitle.Sales).ToString()}}
            , "Choose a Job Title")                               
}

Вывод HTML

<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
<form action="/" method="post">
<input id="Name" name="Name" type="text" value="" />
<select id="Job" name="Job">
<option value="">Choose a Job Title</option>
<option value="111">Accountant</option>
<option value="333">Production</option>
<option value="222">Sales</option>
</select>
</form>
</body>
</html>
0 голосов
/ 02 апреля 2013

Я решил это с этим расширением:

public static SelectList ToSelectListWithDefault<TEnum>(this TEnum enumObj, string defValue, string defText) where TEnum : IConvertible
{
    var values = new List<SelectListItem>();
    var defItem = new SelectListItem() { Value = defValue, Text = defText };
    values.Add(defItem);
    foreach (TEnum e in Enum.GetValues(typeof(TEnum)))
    {
        values.Add(new SelectListItem() { Value = e.ToInt16(null).ToString(), Text = e.ToString() });
    }

    return new SelectList(values, "Value", "Text", defItem);
}   

(я нашел расширение на SO, но без значения по умолчанию)

...