Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用枚举填充DropDownListFor_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 使用枚举填充DropDownListFor

C# 使用枚举填充DropDownListFor,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我在MVC中有这样的模型: public partial class Magazine { public int Id { get; set; } public int MagYear { get; set; } public int MagNo { get; set; } public string MagSeason { get; set; } public string MagYear2 { get; set; } }

我在MVC中有这样的模型:

public partial class Magazine
{           
    public int Id { get; set; }
    public int MagYear { get; set; }
    public int MagNo { get; set; }
    public string MagSeason { get; set; }
    public string MagYear2 { get; set; }    
}
我想看到MagSeason有一个DropDownlist for,并填充了一个

  Enum Season
  {
 Spring =0,
 Summer =1,
 Autumn =2,
 Winter=3
  }

我该怎么做呢?

开始编写自定义html帮助程序,如下文所述,并根据需要更改模板

枚举

看法

然后是助手

[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
    /// <summary>
    /// Sets the display name for an Enum field
    /// </summary>
    /// <param name="displayName">The display name value to use</param>
    public EnumDisplayNameAttribute(string displayName)
        : base(displayName)
    {
    }
}

public static class HtmlHelperExtensions
{
    public static MvcHtmlString EnumDropDownList<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value)
    {
        var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
        return htmlHelper.DropDownList(name, selectItems);
    }

    public static MvcHtmlString EnumDropDownListPlaceholder<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value, string placeholderName = null)
    {
        var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);

        AddPlaceHolderToSelectItems(placeholderName, selectItems);
        return htmlHelper.DropDownList(name, selectItems, new { @class = "placeholder" });
    }




    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes = null) where TModel : class
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        var name = ExpressionHelper.GetExpressionText(expression);
        var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        ModelState currentValueInModelState;
        var couldGetValueFromModelState = htmlHelper.ViewData.ModelState.TryGetValue(fullName, out currentValueInModelState);
        object selectedValue = null;
        if (!couldGetValueFromModelState &&
            htmlHelper.ViewData.Model != null)
        {
            selectedValue = expression.Compile()(htmlHelper.ViewData.Model);
        }

        var placeholderName = PlaceholderName(memberExpression);

        htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);

        var selectItems = GetSelectItemsForEnum(typeof(TProperty), selectedValue).ToList();
        AddPlaceHolderToSelectItems(placeholderName, selectItems);

        return htmlHelper.DropDownListFor(expression, selectItems, htmlAttributes);
    }

    public static MvcHtmlString PlaceholderDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes = null)
        where TModel : class
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        IList<SelectListItem> list = selectList.ToList();
        var placeholderName = PlaceholderName(memberExpression);
        AddPlaceHolderToSelectItems(placeholderName, list);

        htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);

        return htmlHelper.DropDownListFor(expression, list, string.IsNullOrEmpty(optionLabel) ? null : optionLabel, htmlAttributes);
    }

    public static IList<SelectListItem> GetSelectItemsForEnum(Type enumType, object selectedValue)
    {
        var selectItems = new List<SelectListItem>();

        if (enumType.IsGenericType &&
            enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumType = enumType.GetGenericArguments()[0];
            selectItems.Add(new SelectListItem { Value = string.Empty, Text = string.Empty });
        }

        var selectedValueName = selectedValue != null ? selectedValue.ToString() : null;
        var enumEntryNames = Enum.GetNames(enumType);
        var entries = enumEntryNames
            .Select(n => new
            {
                Name = n,
                EnumDisplayNameAttribute = enumType
                    .GetField(n)
                    .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                    .OfType<EnumDisplayNameAttribute>()
                    .SingleOrDefault() ?? new EnumDisplayNameAttribute("")
            })
            .Select(e => new
            {
                Value = e.Name,
                DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name

            })
            .OrderBy(e => e.DisplayName)
            .Select(e => new SelectListItem
            {
                Value = e.Value,
                Text = e.DisplayName,
                Selected = e.Value == selectedValueName
            });

        selectItems.AddRange(entries);

        return selectItems;
    }

    public static IEnumerable<string> GetNamesForEnum(Type enumType, object selectedValue)
    {
        if (enumType.IsGenericType &&
       enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumType = enumType.GetGenericArguments()[0];
        }

        var enumEntryNames = Enum.GetNames(enumType);
        var entries = enumEntryNames
            .Select(n => new
            {
                Name = n,
                EnumDisplayNameAttribute = enumType
                    .GetField(n)
                    .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                    .OfType<EnumDisplayNameAttribute>()
                    .SingleOrDefault() ?? new EnumDisplayNameAttribute("")
            })
            .Select(e => new
            {
                Value = e.Name,
                DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
            })
            .OrderBy(e => e.DisplayName)

            .Select(e => e.Value);
        return entries;
    }

    static string PlaceholderName(MemberExpression memberExpression)
    {
        var placeholderName = memberExpression.Member
            .GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)
            .Cast<EnumDisplayNameAttribute>()
            .Select(a => a.DisplayName)
            .FirstOrDefault();
        return placeholderName;
    }

    static void AddPlaceHolderToSelectItems(string placeholderName, IList<SelectListItem> selectList)
    {
        if (!selectList.Where(i => i.Text == string.Empty).Any())
            selectList.Insert(0, new SelectListItem { Selected = false, Text = placeholderName, Value = string.Empty });

        if (!selectList.Any() || selectList[0].Text != string.Empty) return;

        selectList[0].Value = "";
        selectList[0].Text = placeholderName;
    }

    static IDictionary<string, object> ApplyHtmlAttributes(IDictionary<string, object> htmlAttributes, string placeholderName)
    {
        if (!string.IsNullOrEmpty(placeholderName))
        {
            if (htmlAttributes == null)
            {
                htmlAttributes = new Dictionary<string, object>();
            }

            if (!htmlAttributes.ContainsKey("class"))
                htmlAttributes.Add("class", "placeholder");
            else
            {
                htmlAttributes["class"] += " placeholder";
            }
        }
        return htmlAttributes;
    }

}
[AttributeUsage(AttributeTargets.Field)]
公共类EnumDisplayNameAttribute:System.ComponentModel.DisplayNameAttribute
{
/// 
///设置枚举字段的显示名称
/// 
///要使用的显示名称值
公共EnumDisplayName属性(字符串displayName)
:base(显示名称)
{
}
}
公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString EnumDropDownList(此HtmlHelper HtmlHelper、字符串名称、TEnumType值)
{
var-selectItems=getselectitemsforeum(typeof(TEnumType),value);
返回htmlHelper.DropDownList(名称,selectItems);
}
公共静态MvcHtmlString ENUMDROPDOLLINSTPLACEHOLDER(此HtmlHelper HtmlHelper,字符串名称,TEnumType值,字符串占位符名称=null)
{
var-selectItems=getselectitemsforeum(typeof(TEnumType),value);
将占位符添加到selectItems(占位符名称,selectItems);
返回htmlHelper.DropDownList(名称,selectItems,new{@class=“placeholder”});
}
公共静态MvcHtmlString EnumDropDownListFor(此HtmlHelper HtmlHelper,表达式,IDictionary htmlAttributes=null),其中TModel:class
{
var memberExpression=expression.Body作为memberExpression;
if(memberExpression==null)
抛出新的InvalidOperationException(“表达式必须是成员表达式”);
var name=ExpressionHelper.GetExpressionText(表达式);
var fullName=htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(名称);
ModelState当前值inmodelstate;
var couldGetValueFromModelState=htmlHelper.ViewData.ModelState.TryGetValue(全名,out currentValueInModelState);
objectselectedvalue=null;
如果(!couldGetValueFromModelState&&
htmlHelper.ViewData.Model!=null)
{
selectedValue=expression.Compile()(htmlHelper.ViewData.Model);
}
变量占位符名称=占位符名称(memberExpression);
HtmLatAttributes=ApplyHtmLatAttributes(HtmLatAttributes,占位符名称);
var selectItems=GetSelectItemsForEnum(typeof(TProperty),selectedValue).ToList();
将占位符添加到selectItems(占位符名称,selectItems);
返回htmlHelper.DropDownListFor(表达式、selectItems、htmlAttributes);
}
公共静态MvcHtmlString占位符DropDownList for(此HtmlHelper HtmlHelper、表达式表达式、IEnumerable selectList、字符串选项标签、IDictionary htmlAttributes=null)
其中TModel:class
{
var memberExpression=expression.Body作为memberExpression;
if(memberExpression==null)
抛出新的InvalidOperationException(“表达式必须是成员表达式”);
IList list=selectList.ToList();
变量占位符名称=占位符名称(memberExpression);
将占位符添加到选择项(占位符名称、列表);
HtmLatAttributes=ApplyHtmLatAttributes(HtmLatAttributes,占位符名称);
返回htmlHelper.DropDownListFor(表达式、列表、字符串.IsNullOrEmpty(optionLabel)?null:optionLabel、htmlAttributes);
}
公共静态IList GetSelectItemsForEnum(类型enumType,对象selectedValue)
{
var selectItems=new List();
如果(enumType.IsGenericType)&&
enumType.GetGenericTypeDefinition()==typeof(可为null))
{
enumType=enumType.GetGenericArguments()[0];
添加(新的SelectListItem{Value=string.Empty,Text=string.Empty});
}
var selectedValueName=selectedValue!=null?selectedValue.ToString():null;
var enumEntryNames=Enum.GetNames(enumType);
var entries=enumEntryNames
.选择(n=>new
{
Name=n,
EnumDisplayNameAttribute=enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute),false)
第()类
.SingleOrDefault()??新的EnumDisplayNameAttribute(“”)
})
.选择(e=>new
{
值=e.名称,
DisplayName=e.EnumDisplayNameAttribute.DisplayName??e.Name
})
.OrderBy(e=>e.DisplayName)
.选择(e=>new SelectListItem
{
值=e.值,
Text=e.DisplayName,
Selected=e.Value==selectedValueName
});
选择Items.AddRange(条目);
返回选定的项目;
}
公共静态IEnumerable GetNamesForEnum(类型enumType,对象selectedValue)
{
如果(enumType.IsGenericType)&&
enumType.GetGenericTypeDefinition()==typeof(可为null))
{
enumType=enumType.GetGenericArguments()[0];
}
var enumEntryNames=Enum.GetNames(enumType);
var entries=enumEntryNames
.选择(n=>new
{
Name=n,
EnumDisplayNameAttribute=enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute),false)
第()类
.SingleOrDefault()??新的EnumDisplayNameAttribute(“”)
})
.选择(e=>new
{
值=e.名称,
DisplayName=e.EnumDisplayNameAttribute.DisplayName??e.Name
})
.OrderBy(e=>e.DisplayName)
.选择(e=>e.Value);
返回条目;
}
静态字符串占位符名称(MemberExpression MemberExpression)
@Html.EnumDropDownListFor(m => m.Gender)
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
    /// <summary>
    /// Sets the display name for an Enum field
    /// </summary>
    /// <param name="displayName">The display name value to use</param>
    public EnumDisplayNameAttribute(string displayName)
        : base(displayName)
    {
    }
}

public static class HtmlHelperExtensions
{
    public static MvcHtmlString EnumDropDownList<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value)
    {
        var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
        return htmlHelper.DropDownList(name, selectItems);
    }

    public static MvcHtmlString EnumDropDownListPlaceholder<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value, string placeholderName = null)
    {
        var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);

        AddPlaceHolderToSelectItems(placeholderName, selectItems);
        return htmlHelper.DropDownList(name, selectItems, new { @class = "placeholder" });
    }




    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes = null) where TModel : class
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        var name = ExpressionHelper.GetExpressionText(expression);
        var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        ModelState currentValueInModelState;
        var couldGetValueFromModelState = htmlHelper.ViewData.ModelState.TryGetValue(fullName, out currentValueInModelState);
        object selectedValue = null;
        if (!couldGetValueFromModelState &&
            htmlHelper.ViewData.Model != null)
        {
            selectedValue = expression.Compile()(htmlHelper.ViewData.Model);
        }

        var placeholderName = PlaceholderName(memberExpression);

        htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);

        var selectItems = GetSelectItemsForEnum(typeof(TProperty), selectedValue).ToList();
        AddPlaceHolderToSelectItems(placeholderName, selectItems);

        return htmlHelper.DropDownListFor(expression, selectItems, htmlAttributes);
    }

    public static MvcHtmlString PlaceholderDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes = null)
        where TModel : class
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        IList<SelectListItem> list = selectList.ToList();
        var placeholderName = PlaceholderName(memberExpression);
        AddPlaceHolderToSelectItems(placeholderName, list);

        htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);

        return htmlHelper.DropDownListFor(expression, list, string.IsNullOrEmpty(optionLabel) ? null : optionLabel, htmlAttributes);
    }

    public static IList<SelectListItem> GetSelectItemsForEnum(Type enumType, object selectedValue)
    {
        var selectItems = new List<SelectListItem>();

        if (enumType.IsGenericType &&
            enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumType = enumType.GetGenericArguments()[0];
            selectItems.Add(new SelectListItem { Value = string.Empty, Text = string.Empty });
        }

        var selectedValueName = selectedValue != null ? selectedValue.ToString() : null;
        var enumEntryNames = Enum.GetNames(enumType);
        var entries = enumEntryNames
            .Select(n => new
            {
                Name = n,
                EnumDisplayNameAttribute = enumType
                    .GetField(n)
                    .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                    .OfType<EnumDisplayNameAttribute>()
                    .SingleOrDefault() ?? new EnumDisplayNameAttribute("")
            })
            .Select(e => new
            {
                Value = e.Name,
                DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name

            })
            .OrderBy(e => e.DisplayName)
            .Select(e => new SelectListItem
            {
                Value = e.Value,
                Text = e.DisplayName,
                Selected = e.Value == selectedValueName
            });

        selectItems.AddRange(entries);

        return selectItems;
    }

    public static IEnumerable<string> GetNamesForEnum(Type enumType, object selectedValue)
    {
        if (enumType.IsGenericType &&
       enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumType = enumType.GetGenericArguments()[0];
        }

        var enumEntryNames = Enum.GetNames(enumType);
        var entries = enumEntryNames
            .Select(n => new
            {
                Name = n,
                EnumDisplayNameAttribute = enumType
                    .GetField(n)
                    .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                    .OfType<EnumDisplayNameAttribute>()
                    .SingleOrDefault() ?? new EnumDisplayNameAttribute("")
            })
            .Select(e => new
            {
                Value = e.Name,
                DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
            })
            .OrderBy(e => e.DisplayName)

            .Select(e => e.Value);
        return entries;
    }

    static string PlaceholderName(MemberExpression memberExpression)
    {
        var placeholderName = memberExpression.Member
            .GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)
            .Cast<EnumDisplayNameAttribute>()
            .Select(a => a.DisplayName)
            .FirstOrDefault();
        return placeholderName;
    }

    static void AddPlaceHolderToSelectItems(string placeholderName, IList<SelectListItem> selectList)
    {
        if (!selectList.Where(i => i.Text == string.Empty).Any())
            selectList.Insert(0, new SelectListItem { Selected = false, Text = placeholderName, Value = string.Empty });

        if (!selectList.Any() || selectList[0].Text != string.Empty) return;

        selectList[0].Value = "";
        selectList[0].Text = placeholderName;
    }

    static IDictionary<string, object> ApplyHtmlAttributes(IDictionary<string, object> htmlAttributes, string placeholderName)
    {
        if (!string.IsNullOrEmpty(placeholderName))
        {
            if (htmlAttributes == null)
            {
                htmlAttributes = new Dictionary<string, object>();
            }

            if (!htmlAttributes.ContainsKey("class"))
                htmlAttributes.Add("class", "placeholder");
            else
            {
                htmlAttributes["class"] += " placeholder";
            }
        }
        return htmlAttributes;
    }

}
public static class EnumHelper
{
    //Creates a SelectList for a nullable enum value
    public static SelectList SelectListFor<T>(T? selected) where T : struct
    {
        return selected == null ? SelectListFor<T>()
                                : SelectListFor(selected.Value);
    }

    //Creates a SelectList for an enum type
    public static SelectList SelectListFor<T>() where T : struct
    {
        Type t = typeof (T);
        if (t.IsEnum)
        {
            var values = Enum.GetValues(typeof(T)).Cast<enum>()
                             .Select(e => new { 
                                            Id = Convert.ToInt32(e), 
                                            Name = e.GetDescription() 
                                          });

            return new SelectList(values, "Id", "Name");
        }
        return null;
    }

    //Creates a SelectList for an enum value
    public static SelectList SelectListFor<T>(T selected) where T : struct 
    {
        Type t = typeof(T);
        if (t.IsEnum)
        {
            var values = Enum.GetValues(t).Cast<Enum>()
                             .Select(e => new { 
                                            Id = Convert.ToInt32(e), 
                                            Name = e.GetDescription() 
                                          });

            return new SelectList(values, "Id", "Name", Convert.ToInt32(selected));
        }
        return null;
    } 

    // Get the value of the description attribute if the 
    // enum has one, otherwise use the value.
    public static string GetDescription<TEnum>(this TEnum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        if (fi != null)
        {
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
            {
                 return attributes[0].Description;
            }
        }

        return value.ToString();
    }
}
//If you don't have an enum value use the type
ViewBag.DropDownList = EnumHelper.SelectListFor<MyEnum>();

//If you do have an enum value use the value (the value will be marked as selected)
ViewBag.DropDownList = EnumHelper.SelectListFor(myEnumValue);
@Html.DropDownList("DropDownList")