To Bind Enum value in Drop Down use the following
CSHTML
To display list of enum and select the value
@Html.EnumDropDownList(model => model.State,
new { Id = "ddlState" })
To display list of enum item and keep binding when save/modify
@Html.EnumDropDownListFor(model =>
model.StateSelected, Model.State, new { Id = "ddlState" })
Note: model.StateSelected is int value.
Model
private int _StateSelected = 1;
public int StateSelected
{
get { return _StateSelected; }
set { _StateSelected = value; }
}
private State _State = 1;
public State State
{
get { return _State; }
set { _State= value; }
}
Note: State is enum
public enum State
{
Tamilnadu =1,
Karnadaka,
..
}
Helper Class
/// <summary>
/// Enums the drop down list for.
/// </summary>
/// <typeparam
name="TModel">The type of the
model.</typeparam>
/// <typeparam
name="TEnum">The type of the enum.</typeparam>
/// <param
name="htmlHelper">The HTML helper.</param>
/// <param
name="expression">The expression.</param>
/// <param
name="htmlAttributes">The HTML
attributes.</param>
/// <returns></returns>
public static MvcHtmlString EnumDropDownList<TModel, TEnum>(this HtmlHelper<TModel>
htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes = null)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type enumType = GetNonNullableModelType(metadata);
Type baseEnumType = Enum.GetUnderlyingType(enumType);
IEnumerable<SelectListItem> items = from value in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)
select new SelectListItem()
{
Text = GetEnumDisplayValue(value),
Value = Convert.ChangeType(value.GetValue(null), baseEnumType).ToString(),
Selected = (value.GetValue(null).Equals(metadata.Model))
};
return SelectExtensions.DropDownList(htmlHelper, "EnumDropDown", items, htmlAttributes);
}
/// <summary>
/// Enums the drop down list for.
/// </summary>
/// <typeparam
name="TModel">The type of the
model.</typeparam>
/// <typeparam
name="TEnum">The type of the enum.</typeparam>
/// <typeparam
name="TProperty">The type of the
property.</typeparam>
/// <param
name="htmlHelper">The HTML helper.</param>
/// <param
name="expression">The expression.</param>
/// <param
name="enumType">Type of the enum.</param>
/// <param
name="htmlAttributes">The HTML
attributes.</param>
/// <returns></returns>
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum, TProperty>(this HtmlHelper<TModel>
htmlHelper, Expression<Func<TModel, TEnum>> expression, TProperty enumType, object htmlAttributes = null)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type baseEnumType = Enum.GetUnderlyingType(typeof(TProperty));
IEnumerable<SelectListItem> items = from value in typeof(TProperty).GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)
select new SelectListItem()
{
Text = GetEnumDisplayValue(value),
Value = Convert.ChangeType(value.GetValue(null), baseEnumType).ToString(),
Selected = (value.GetValue(null).Equals(metadata.Model))
};
return SelectExtensions.DropDownListFor(htmlHelper, expression, items,
htmlAttributes);
}
/// Gets the enum display value.
/// </summary>
/// <param
name="field">The field.</param>
/// <returns></returns>
private static string GetEnumDisplayValue(FieldInfo field)
{
string text;
DescriptionAttribute[] attributes =
(DescriptionAttribute[])field.GetCustomAttributes(
typeof(DescriptionAttribute),
false);
if (attributes != null &&
attributes.Length > 0)
{
text =
attributes[0].Description;
}
else
{
text = field.Name;
}
return text;
}
/// <summary>
/// Gets the type of the non nullable model.
/// </summary>
/// <param
name="modelMetadata">The
model metadata.</param>
/// <returns></returns>
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type realModelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(realModelType);
if (underlyingType != null)
{
realModelType = underlyingType;
}
return realModelType;
}