1

我最近做了一个扩展,用于将下拉列表绑定到模型,不幸的是我无法将 -wanna设为默认值- “请选择...”作为默认值始终选择下拉列表的索引为 1,并且它选择 Enum 的第一项为默认项。我基于进行了扩展-达林的好答案-

我被建议使用可为空的 enum,我还不能让它工作,希望得到帮助

帮助器中默认选择文本的规范:

return htmlHelper.DropDownListFor(expression, items, "Please select ...");

如何在任何下拉菜单中将“请选择...”选为默认选项。

在我使用的 ViewModel 中:

public TimePlan? TimeList { get; set; }
4

1 回答 1

3

你这样做是不对的。应该为空的不是 TimeList,而是应该存储所选项目的 TimePlan 属性。以下是您的视图模型中应该包含的内容:

public TimePlan? TheTimePlan { get; set; }

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

        return
            from value in values
            select new SelectListItem
            {
                Text = Enum.GetName(typeof(TimePlan), value),
                Value = value.ToString(),
            };
    }
}

然后,在您的视图中,您将拥有:

@Html.DropDownListFor(model => model.TheTimePlan, Model.TimeList, "Please select...")

更新:

如果你想创建一个自定义的 html 帮助器,你可以这样做:

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

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

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

private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
    Type modelType = modelMetadata.ModelType;

    Type underlyingType = Nullable.GetUnderlyingType(modelType);
    if (underlyingType != null)
    {
        modelType = underlyingType;
    }
    return modelType;
}

然后,在您的视图中,您将拥有:

@Html.DropDownListForEnum(model => model.TheTimePlan, "Please select...")
于 2013-08-15T14:28:44.637 回答