741 Stimmen

Wie erstellen Sie eine Dropdownliste aus einer Aufzählung in ASP.NET MVC?

Ich versuche, die Html.DropDownList Erweiterungsmethode, kann aber nicht herausfinden, wie man sie mit einer Aufzählung verwenden kann.

Nehmen wir an, ich habe eine Aufzählung wie diese:

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

Wie erstelle ich eine Auswahlliste mit diesen Werten unter Verwendung der Html.DropDownList Erweiterungsmethode?

Oder ist meine beste Wette, um einfach eine for-Schleife erstellen und die Html-Elemente manuell erstellen?

5voto

Alkasai Punkte 3253

Ich habe eine Antwort gefunden aquí . Allerdings haben einige meiner Enums [Description(...)] Attribut, daher habe ich den Code geändert, um dies zu unterstützen:

    enum Abc
    {
        [Description("Cba")]
        Abc,

        Def
    }

    public static MvcHtmlString EnumDropDownList<TEnum>(this HtmlHelper htmlHelper, string name, TEnum selectedValue)
    {
        IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum))
            .Cast<TEnum>();

        List<SelectListItem> items = new List<SelectListItem>();
        foreach (var value in values)
        {
            string text = value.ToString();

            var member = typeof(TEnum).GetMember(value.ToString());
            if (member.Count() > 0)
            {
                var customAttributes = member[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
                if (customAttributes.Count() > 0)
                {
                    text = ((DescriptionAttribute)customAttributes[0]).Description;
                }
            }

            items.Add(new SelectListItem
            {
                Text = text,
                Value = value.ToString(),
                Selected = (value.Equals(selectedValue))
            });
        }

        return htmlHelper.DropDownList(
            name,
            items
            );
    }

Ich hoffe, das hilft.

0 Stimmen

Ich möchte ein Element vom Typ = DropdownList zurückgeben. Ich komme gut mit dem Attribut Text = DescriptionAttribute zurecht, finde es aber schwierig, den int-Wert von Value zu erhalten

4voto

jgauffin Punkte 97446

Sie können auch meine benutzerdefinierten HtmlHelper in Griffin.MvcContrib verwenden. Der folgende Code:

@Html2.CheckBoxesFor(model => model.InputType) <br />
@Html2.RadioButtonsFor(model => model.InputType) <br />
@Html2.DropdownFor(model => model.InputType) <br />

Erzeugt:

enter image description here

https://github.com/jgauffin/griffin.mvccontrib

4voto

Vadim Sentiaev Punkte 693

Dies ist meine Version der Helper-Methode. Ich benutze dies:

var values = from int e in Enum.GetValues(typeof(TEnum))
             select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };

Stattdessen:

var values = from TEnum e in Enum.GetValues(typeof(TEnum))
           select new { ID = (int)Enum.Parse(typeof(TEnum),e.ToString())
                     , Name = e.ToString() };

Hier ist sie:

public static SelectList ToSelectList<TEnum>(this TEnum self) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum)
        {
            throw new ArgumentException("self must be enum", "self");
        }

        Type t = typeof(TEnum);

        var values = from int e in Enum.GetValues(typeof(TEnum))
                     select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };

        return new SelectList(values, "ID", "Name", self);
    }

4voto

brafales Punkte 570

Wenn Sie Lokalisierungsunterstützung hinzufügen möchten, ändern Sie die Methode s.toString() einfach in etwas wie dieses:

ResourceManager rManager = new ResourceManager(typeof(Resources));
var dayTypes = from OperatorCalendarDay.OperatorDayType s in Enum.GetValues(typeof(OperatorCalendarDay.OperatorDayType))
               select new { ID = s, Name = rManager.GetString(s.ToString()) };

Hier ist typeof(Resources) die Ressource, die Sie laden möchten, und dann erhalten Sie den lokalisierten String, der auch nützlich ist, wenn Ihr Enumerator Werte mit mehreren Wörtern hat.

4voto

justabuzz Punkte 832

Eine weitere Korrektur dieser Erweiterungsmethode - die aktuelle Version wählte nicht den aktuellen Wert der Enum aus. Ich habe die letzte Zeile korrigiert:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                       select new
                       {
                           ID = (int)Enum.Parse(typeof(TEnum), e.ToString()),
                           Name = e.ToString()
                       };

        return new SelectList(values, "ID", "Name", ((int)Enum.Parse(typeof(TEnum), enumObj.ToString())).ToString());
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X