如何在.NET的MVC中对视图模型执行Enum绑定?

Las*_*Bye 0 asp.net-mvc enums type-conversion model-binding

如何将枚举绑定到MVC中的下拉列表以使模型在发布后有效?不确定是否需要转换器或其他东西,我提供代码,您推荐的解决方案是什么? (以下代码导致ModelError)

枚举:

public enum TimePlan
{   Routine = 0,
    Single = 1 }
Run Code Online (Sandbox Code Playgroud)

该模型 :

 public TimePlan TheTimePlan { get; set; }

 public SelectListItem[] TimeList { get; set; }
Run Code Online (Sandbox Code Playgroud)

控制器:

    [HttpPost]
    public virtual ActionResult Education(EducationViewModel EducationModelInfo)
    {
        if (ModelState.IsValid)
        { ...
    } }
Run Code Online (Sandbox Code Playgroud)

视图绑定:

@Html.DropDownListFor(m => m.CourseTimePlan, Model.TimeList, "Please select the time plan") 
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

您尚未显示如何填充此TimeList集合.尝试这样,它应该工作:

public TimePlan TheTimePlan { get; set; }

public IEnumerable<SelectListItem> TimeList
{
    get
    {
        var enumType = typeof(TimePlan);
        var values = Enum.GetValues(enumType).Cast<TimePlan>();

        var converter = TypeDescriptor.GetConverter(enumType);

        return
            from value in values
            select new SelectListItem
            {
                Text = converter.ConvertToString(value),
                Value = value.ToString(),
            };
    }
}
Run Code Online (Sandbox Code Playgroud)

或者为了使它更通用,你可以编写一个可重用的帮助器:

public static IHtmlString DropDownListForEnum<TModel, TEnum>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TEnum>> expression
)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var enumType = GetNonNullableModelType(metadata);
    var values = Enum.GetValues(enumType).Cast<TEnum>();
    var converter = TypeDescriptor.GetConverter(enumType);

    var items =
        from value in values
        select new SelectListItem
        {
            Text = converter.ConvertToString(value), 
            Value = value.ToString(), 
            Selected = value.Equals(metadata.Model)
        };

    return htmlHelper.DropDownListFor(expression, items);
}
Run Code Online (Sandbox Code Playgroud)

然后你的模型只能包含Enum值:

public TimePlan TheTimePlan { get; set; }
Run Code Online (Sandbox Code Playgroud)

并在您的视图中使用帮助器:

@Html.DropDownListForEnum(x => x.TheTimePlan)
Run Code Online (Sandbox Code Playgroud)