For MVC v5.1 use Html.EnumDropDownListFor
@Html.DropDownList("MyType", Html.GetEnumSelectList(typeof(MyType)) , "Select My Type", new { @class = "form-control" })
For MVC v5 use EnumHelper
@Html.DropDownList("MyType", EnumHelper.GetSelectList(typeof(MyType)) , "Select My Type", new { @class = "form-control" })
For MVC >5 and lower
I rolled Rune's answer into an extension method:
namespace MyApp.Common { public static class MyExtensions{ public static SelectList ToSelectList(this TEnum enumObj) where TEnum : struct, IComparable, IFormattable, IConvertible { var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { Id = e, Name = e.ToString() }; return new SelectList(values, "Id", "Name", enumObj); } } }
This allows you to write:
ViewData["taskStatus"] = task.Status.ToSelectList();
by
using MyApp.Common
Alternatively:
Create a custom helper class and use Html.EnumDropDownListFor for all lower version MVC < 5.1 (i.e. 3.x, 4.x, 5.0). Here is the class code:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Web.Mvc; using System.Web.Mvc.Html; ////// Class ENUM Helper /// public static class EnumHelper { ////// The single empty item /// private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = string.Empty, Value = string.Empty } }; ////// Gets the ENUM description. /// ///The type of the ENUM. /// The value. ///ENUM Description public static string GetEnumDescription(TEnum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if ((attributes != null) && (attributes.Length > 0)) { return attributes[0].Description; } else { return value.ToString(); } } /// /// ENUMS the drop down list for. /// ///The type of the model. ///The type of the ENUM. /// The HTML helper. /// The expression. ///MVC Html String public static MvcHtmlString EnumDropDownListFor(this HtmlHelper htmlHelper, Expression > expression) { return EnumDropDownListFor(htmlHelper, expression, null); } /// /// ENUMS the drop down list for. /// ///The type of the model. ///The type of the ENUM. /// The HTML helper. /// The expression. /// The HTML attributes. ///MVC Html String public static MvcHtmlString EnumDropDownListFor(this HtmlHelper htmlHelper, Expression > expression, object htmlAttributes) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); Type enumType = GetNonNullableModelType(metadata); IEnumerable values = Enum.GetValues(enumType).Cast (); IEnumerable items = from value in values select new SelectListItem { 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) { items = SingleEmptyItem.Concat(items); } return htmlHelper.DropDownListFor(expression, items, htmlAttributes); } /// /// Gets the type of the non null-able model. /// /// The model metadata. ///real Model Type private static Type GetNonNullableModelType(ModelMetadata modelMetadata) { Type realModelType = modelMetadata.ModelType; Type underlyingType = Nullable.GetUnderlyingType(realModelType); if (underlyingType != null) { realModelType = underlyingType; } return realModelType; } }
Usage:
@Html.EnumDropDownListFor(model => model.EnumProperty, "Select Enum", new { @class = "form-control", type = "text"})
No comments:
Post a Comment