超文本标记语言我可以按字母顺序排序吗?

本文关键字:排序 顺序 我可以 超文本标记语言 | 更新日期: 2023-09-27 18:07:40

我喜欢新的Html。EnumDropdownListFor在MVC 5.1中,我看到我可以在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 ?

超文本标记语言我可以按字母顺序排序吗?

我想出了一个解决方案,获取Enum值,对它们进行排序,然后调用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);
}

是否有一种方法可以自动让MVC按字母顺序为我排序DDL ?

我不知道该怎么做。没有重载似乎采取任何形式的排序参数,如ASC或DESC.似乎你要么必须实现你自己的版本的EnumDropDownListFor,可能使用EnumDropDownListFor本身,或使用javascript解决方案排序选择元素后的事实。

您可以从System.Web.Mvc.Html.EnumHelper.GetSelectList方法中获益,使用DropDownListFor代替EnumDropdownListFor,如下所示:

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

按您希望显示的顺序设置枚举项。这样的:

'// 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...