【问题标题】:Html.EnumDropdownListFor can I order alphabetically?Html.EnumDropdownListFor 我可以按字母顺序排列吗?
【发布时间】:2014-07-30 10:00:44
【问题描述】:

我喜欢 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?

【问题讨论】:

  • Order 似乎不适合我。
  • 创建一个将 Enum 转换为 SelectList 的扩展方法。另外我建议不要使用枚举,而是使用类,即使它们是 KeyValuePair 或 Tuple。
  • 从1开始,你有没有神?

标签: c# asp.net-mvc enums


【解决方案1】:

我想出了一个解决方案,它获取 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);
}

【讨论】:

  • 这个的 asp.net 核心版本会很方便... :-)
  • 这段代码确实有效。 @jhilden 您可以选择“答案”。您可以将“IDictionary htmlAttributes”更改为“object htmlAttributes”
【解决方案2】:

有没有办法让 MVC 自动为我按字母顺序排列 DDL?

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      有。

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

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

      【讨论】:

      • 如果您需要插入一个介于 2 和 3 之间的值会怎样?如果这些仍然存在,那么您只是引入了一个严重的错误。
      • 如果您要保留枚举值,那么您可能应该明确地对它们进行编号。但是,如果您在值 2 和 3 之间插入一个值为 100 的条目,我不知道它是否会按照您想要的方式进行排序。我不知道它是按值排序,还是按定义顺序排序。
      • 这只是一个真正的解决方案,即使用这些枚举存储在数据库中,在生产中如果您已经在数据库中有数据并更改枚举的顺序,它将使您的数据成为错误,因为它已经与以前的值一起存储了。
      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多