Wednesday, June 25, 2014

MVC Razor - Enum Drop List


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 { _Statevalue; }
}


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;
        }