Html.EnumDropdownListFor 我可以按字母顺序排序吗?

问题描述 投票:0回答:5

我喜欢 MVC 5.1 中新的 Html.EnumDropdownListFor,并且我发现我可以在 Display 属性中指定值的顺序,如下所示:

    public enum AssignableDataFieldEnum
    {
        [Display(Name = "Code Value", Order=1)]
        CodeValue = 1,
        [Display(Name = "Final Digit", Order=2)]
        FinalDigit = 2,
        [Display(Name = "Group Number", Order=3)]
        GroupNumber = 3,
        [Display(Name = "Sequence Number", Order=4)]
        SequenceNumber = 4
}

这个解决方案在本地化方面似乎目光短浅。有没有办法让 MVC 自动按字母顺序对 DDL 进行排序?

c# asp.net-mvc enums
5个回答
9
投票

我想出了一个解决方案,获取枚举值,对它们进行排序,然后调用

HtmlHelper.DropDownListFor()

public static MvcHtmlString EnumSortedDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string optionLabel = null, IDictionary<string, object> htmlAttributes = null) {
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var selectList = EnumHelper.GetSelectList(metadata.ModelType).OrderBy(i => i.Text).ToList();
    if (!String.IsNullOrEmpty(optionLabel) && selectList.Count != 0 && String.IsNullOrEmpty(selectList[0].Text)) {
        selectList[0].Text = optionLabel;
        optionLabel = null;
    }

    return htmlHelper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
}

1
投票

有没有办法自动让 MVC 按字母顺序对 DDL 进行排序?

我不明白怎么办。所有重载似乎都不采用任何形式的排序参数,例如 ASC 或 DESC。看来您要么必须实现自己的 EnumDropDownListFor 版本(可能使用 EnumDropDownListFor 本身),要么使用 JavaScript 解决方案在事后对选择元素进行排序。


0
投票

您可以从

System.Web.Mvc.Html.EnumHelper.GetSelectList
方法中受益,并使用
DropDownListFor
而不是
EnumDropdownListFor
,如下所示:

@Html.DropDownListFor(m => m.Type, EnumHelper.GetSelectList(typeof(MailTemplateType), Model.Type).OrderBy(t => t.Text))

0
投票

如果枚举中有负数或超过 1 位数字,请将

OrderBy(e => int.Parse(e.Value))
添加到 HtmlHelper.GetEnumSelectList 方法中:

asp-items="Html.GetEnumSelectList<WineSugarContent>().OrderBy(e => int.Parse(e.Value))"

-2
投票

有。

只需按照您希望的显示顺序设置枚举项即可。像这样:

'// VB.NET
Public Enum AceFriendlyFlags

    <Display(Name:="This folder only")>                      '// Will be at pos 1
    ThisFolderOnly = AceFlags.None

    <Display(Name:="This folder, subfolders and files")>     '// Will be at pos 2
    ThisFolderSubfoldersAndFiles = AceFlags.CONTAINER_INHERIT_ACE + AceFlags.OBJECT_INHERIT_ACE

    <Display(Name:="This folder and subfolders")>            '// Will be at pos 3
    ThisFolderAndSubfolders = AceFlags.CONTAINER_INHERIT_ACE

    etc...
© www.soinside.com 2019 - 2024. All rights reserved.