1

最近、ドロップダウンリストをモデルにバインドするための拡張機能を作成しましたが、残念ながら、-wanna be default- 「選択してください...」をデフォルトとして選択することはできませんでした常にドロップダウンのインデックスは 1 であり、Enum の最初の項目をデフォルトのアイテム。これに基づいて拡張機能を作成しまし-Darin's great answer-

nullable enumを使用するようにアドバイスされましたが、まだ機能させることができませんでした。

ヘルパーのデフォルトの選択テキストの仕様:

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

任意のドロップダウンでデフォルトとして選択されている「選択してください...」を作成する方法。

私が使用したViewModelでは:

public TimePlan? TimeList { get; set; }
4

1 に答える 1

3

それは間違っている。null 可能であるべきは 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 に答える