Asp.net mvc 如何在.NET的MVC中执行与视图模型的枚举绑定?

Asp.net mvc 如何在.NET的MVC中执行与视图模型的枚举绑定?,asp.net-mvc,enums,type-conversion,model-binding,Asp.net Mvc,Enums,Type Conversion,Model Binding,如何将枚举绑定到MVC中的下拉列表中,以使模型在发布后有效? 不确定它是否需要转换器或其他东西,我提供了代码,您建议的解决方案是什么? 下面的代码导致ModelError 枚举: 模型: 控制器: 视图绑定: 您还没有展示如何填充此时间列表集合。像这样尝试,它应该可以工作: public TimePlan TheTimePlan { get; set; } public IEnumerable<SelectListItem> TimeList { get {

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

枚举:

模型:

控制器:

视图绑定:


您还没有展示如何填充此时间列表集合。像这样尝试,它应该可以工作:

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(),
            };
    }
}
在您的视图中,使用帮助器:

@Html.DropDownListForEnum(x => x.TheTimePlan)

谢谢Darin,这就是我一直在寻找的,你能告诉我怎样才能添加一个请选择。。。在这些上面?我以前的方式在这里不起作用。当然,只需将其作为参数添加到帮助器中。我尝试了类似这样的测试:return htmlHelper.DropDownListForexpression,items,请从下面的列表中选择;但dropdownlist的选定索引始终为1而不是0。这是正常情况,枚举是值类型。如果您希望能够拥有这样的默认值,那么应该在视图模型中将其声明为可为null的枚举。
    [HttpPost]
    public virtual ActionResult Education(EducationViewModel EducationModelInfo)
    {
        if (ModelState.IsValid)
        { ...
    } }
@Html.DropDownListFor(m => m.CourseTimePlan, Model.TimeList, "Please select the time plan") 
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(),
            };
    }
}
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);
}
public TimePlan TheTimePlan { get; set; }
@Html.DropDownListForEnum(x => x.TheTimePlan)