Как создать выпадающий список из перечисления в ASP.NET MVC? - PullRequest
632 голосов
/ 23 декабря 2008

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

Допустим, у меня есть такое перечисление:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}

Как мне создать выпадающий список с этими значениями, используя метод расширения Html.DropDownList?

Или лучше всего просто создать цикл for и создать элементы Html вручную?

Ответы [ 36 ]

1 голос
/ 01 октября 2012

Я закончил тем, что создал методы расширения, чтобы сделать то, что по сути является ответом здесь. Последняя половина Gist посвящена Enum конкретно.

https://gist.github.com/3813767

1 голос
/ 28 октября 2011

@ Саймон Голдстоун: Спасибо за ваше решение, оно может быть идеально применено в моем случае. Единственная проблема заключается в том, что мне пришлось перевести его на VB. Но теперь это сделано, и чтобы сэкономить время других людей (в случае, если им это нужно), я поместил его здесь:

Imports System.Runtime.CompilerServices
Imports System.ComponentModel
Imports System.Linq.Expressions

Public Module HtmlHelpers
    Private Function GetNonNullableModelType(modelMetadata As ModelMetadata) As Type
        Dim realModelType = modelMetadata.ModelType

        Dim underlyingType = Nullable.GetUnderlyingType(realModelType)

        If Not underlyingType Is Nothing Then
            realModelType = underlyingType
        End If

        Return realModelType
    End Function

    Private ReadOnly SingleEmptyItem() As SelectListItem = {New SelectListItem() With {.Text = "", .Value = ""}}

    Private Function GetEnumDescription(Of TEnum)(value As TEnum) As String
        Dim fi = value.GetType().GetField(value.ToString())

        Dim attributes = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())

        If Not attributes Is Nothing AndAlso attributes.Length > 0 Then
            Return attributes(0).Description
        Else
            Return value.ToString()
        End If
    End Function

    <Extension()>
    Public Function EnumDropDownListFor(Of TModel, TEnum)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TEnum))) As MvcHtmlString
        Return EnumDropDownListFor(htmlHelper, expression, Nothing)
    End Function

    <Extension()>
    Public Function EnumDropDownListFor(Of TModel, TEnum)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TEnum)), htmlAttributes As Object) As MvcHtmlString
        Dim metaData As ModelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)
        Dim enumType As Type = GetNonNullableModelType(metaData)
        Dim values As IEnumerable(Of TEnum) = [Enum].GetValues(enumType).Cast(Of TEnum)()

        Dim items As IEnumerable(Of SelectListItem) = From value In values
            Select New SelectListItem With
            {
                .Text = GetEnumDescription(value),
                .Value = value.ToString(),
                .Selected = value.Equals(metaData.Model)
            }

        ' If the enum is nullable, add an 'empty' item to the collection
        If metaData.IsNullableValueType Then
            items = SingleEmptyItem.Concat(items)
        End If

        Return htmlHelper.DropDownListFor(expression, items, htmlAttributes)
    End Function
End Module

Конец Вы используете это так:

@Html.EnumDropDownListFor(Function(model) (model.EnumField))
1 голос
/ 23 октября 2013
@Html.DropDownListFor(model => model.MaritalStatus, new List<SelectListItem> 
{  

new SelectListItem { Text = "----Select----", Value = "-1" },


new SelectListItem { Text = "Marrid", Value = "M" },


 new SelectListItem { Text = "Single", Value = "S" }

})
1 голос
/ 30 мая 2013
@Html.DropdownListFor(model=model->Gender,new List<SelectListItem>
{
 new ListItem{Text="Male",Value="Male"},
 new ListItem{Text="Female",Value="Female"},
 new ListItem{Text="--- Select -----",Value="-----Select ----"}
}
)
0 голосов
/ 23 декабря 2008

ОБНОВЛЕНО - Я бы предложил использовать предложение по Руне ниже, а не эту опцию!


Я предполагаю, что вы хотите что-то вроде следующего выплюнули:

<select name="blah">
    <option value="1">Movie</option>
    <option value="2">Game</option>
    <option value="3">Book</option>
</select>

, что вы можете сделать с помощью метода расширения, например:

public static string DropdownEnum(this System.Web.Mvc.HtmlHelper helper,
                                  Enum values)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    sb.Append("<select name=\"blah\">");
    string[] names = Enum.GetNames(values.GetType());
    foreach(string name in names)
    {
        sb.Append("<option value=\"");
        sb.Append(((int)Enum.Parse(values.GetType(), name)).ToString());
        sb.Append("\">");
        sb.Append(name);
        sb.Append("</option>");
    }
    sb.Append("</select>");
    return sb.ToString();
}

НО подобные вещи не локализуемы (то есть будет трудно перевести на другой язык).

Примечание: вам нужно вызвать статический метод с экземпляром перечисления, т.е. Html.DropdownEnum(ItemTypes.Movie);

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

0 голосов
/ 15 января 2014

1- Создайте свой ENUM

public enum LicenseType
{
    xxx = 1,
    yyy = 2
}

2- Создайте свой класс обслуживания

public class LicenseTypeEnumService
    {

        public static Dictionary<int, string> GetAll()
        {

            var licenseTypes = new Dictionary<int, string>();

            licenseTypes.Add((int)LicenseType.xxx, "xxx");
            licenseTypes.Add((int)LicenseType.yyy, "yyy");

            return licenseTypes;

        }

        public static string GetById(int id)
        {

            var q = (from p in this.GetAll() where p.Key == id select p).Single();
            return q.Value;

        }

    }

3- Установите ViewBag в вашем контроллере

var licenseTypes = LicenseTypeEnumService.GetAll();
ViewBag.LicenseTypes = new SelectList(licenseTypes, "Key", "Value");

4 - Свяжите свой DropDownList

@Html.DropDownList("LicenseType", (SelectList)ViewBag.LicenseTypes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...