【问题标题】:How do I perform an Enum binding to a view's model in .NET's MVC?如何在 .NET 的 MVC 中对视图模型执行 Enum 绑定?
【发布时间】:2013-08-15 08:03:03
【问题描述】:

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

枚举:

public enum TimePlan
{   Routine = 0,
    Single = 1 }

模型:

 public TimePlan TheTimePlan { get; set; }

 public SelectListItem[] TimeList { get; set; }

控制器:

    [HttpPost]
    public virtual ActionResult Education(EducationViewModel EducationModelInfo)
    {
        if (ModelState.IsValid)
        { ...
    } }

视图绑定:

@Html.DropDownListFor(m => m.CourseTimePlan, Model.TimeList, "Please select the time plan") 

【问题讨论】:

    标签: asp.net-mvc enums type-conversion model-binding


    【解决方案1】:

    您尚未展示如何填充此 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(),
                };
        }
    }
    

    或者为了让它更通用一点,你可以编写一个可重用的助手:

    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)
    

    【讨论】:

    • 谢谢达林,这就是我要找的
    • 您能告诉我如何在这些上添加“请选择...”吗?我以前不在这里工作的方式。
    • 当然,只需将它作为参数添加到帮助程序。
    • 我尝试过这样的测试:return htmlHelper.DropDownListFor(expression, items,"请从下面的列表中选择");但下拉列表的选定索引始终是“1”而不是“0”。
    • 这很正常,枚举是值类型。如果您希望能够拥有这样的默认值,则应在视图模型上将其声明为可为空的枚举。
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多