[asp.net-mvc]从使用 enum 和实体框架脚手架的模型中创建一个下拉列表?

发布时间: 2017/3/25 3:46:45
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

有实体框架,以自动模式的枚举属性在 HTML 中创建下拉列表的方式吗?这里是我目前所里面我的模型,但是当运行我的项目还有只是文本框而不是一个下拉列表 !

public enum MajorList { Accounting, BusinessHonors, Finance, InternationalBusiness, Management, MIS, Marketing, SupplyChainManagement, STM }
[Display(Name = "Major")]
[Required(ErrorMessage = "Please select your major.")]
[EnumDataType(typeof(MajorList))]
public MajorList Major { get; set; }

解决方法 1:

你可以改变你 @Html.EditorFor 为以下︰

@Html.EnumDropDownListFor(model => model.Major, htmlAttributes: new { @class = "form-control" })

更新︰

作为在他的评论中确认的 @StephenMuecke EnumDropDownListFor 是唯一可在 MVC 5.1,所以另一种解决方案可以获取枚举值使用 Enum.GetValues 方法。可以使用一个选项来将数据传递到视图 ViewBag :

var majorList = Enum.GetValues(typeof(MajorList))
                    .Cast<MajorList>()
                    .Select(e => new SelectListItem
                         {
                             Value =e.ToString(),
                             Text = e.ToString()
                         });
ViewBag.MajorList=majorList;

或将其添加作为你 ViewModel 中的一个属性,如果您正在使用这种方式。

后来在您的视图,您可以使用 DropDownList ,如下所示︰

@Html.DropDownListFor(model => model.Major, ViewBag.MajorList, htmlAttributes: new { @class = "form-control" })

根据在此发布解决方案以下也应该工作︰

@Html.DropDownListFor(model =>model.Major, new SelectList(Enum.GetValues(typeof(MajorList))))

另一个解决方案可能会创建您自己 EnumDropDownListFor 帮手 (查看此,如果你想要阅读更多关于这种解决方案):

using System.Web.Mvc.Html;

public static class HTMLHelperExtensions
{
    public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();

        IEnumerable<SelectListItem> items =
            values.Select(value => new SelectListItem
            {
                Text = value.ToString(),
                Value = value.ToString(),
                Selected = value.Equals(metadata.Model)
            });

        return htmlHelper.DropDownListFor(
            expression,
            items
            );
    }
}

这种方式,你也能做到,我建议,在我的答案开始只是你需要引用的命名空间,在那里您将你静态的类声明与您的扩展︰

@using yourNamespace 
//...

 @Html.EnumDropDownListFor(model => model.Major, htmlAttributes: new { @class = "form-control" })
官方微信
官方QQ群
31647020