假设模型具有枚举属性,Entity Framework是否有办法在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; }
答案 0 :(得分:3)
您可以为以下内容更改@Html.EditorFor
:
@Html.EnumDropDownListFor(model => model.Major, htmlAttributes: new { @class = "form-control" })
由于@StephenMuecke在他的评论EnumDropDownListFor
中确认仅在MVC 5.1中可用,因此另一种解决方案可能是使用Enum.GetValues
方法获取枚举值。将该数据传递到View的一种方法是使用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" })
根据此post中的解决方案,以下内容也应该有效:
@Html.DropDownListFor(model =>model.Major, new SelectList(Enum.GetValues(typeof(MajorList))))
另一种解决方案是创建自己的EnumDropDownListFor
帮助器(如果您想了解有关此类解决方案的更多信息,请查看此page):
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" })