我喜欢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?
答案 0 :(得分:6)
我想出了一个获取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);
}
答案 1 :(得分:1)
有没有办法自动让MVC按字母顺序为我命令DDL?
我不知道怎么做。没有任何重载似乎采用任何形式的排序参数,如ASC或DESC。您似乎必须实现自己的EnumDropDownListFor版本,可能使用EnumDropDownListFor本身,或者使用javascript解决方案对事后的select元素进行排序。
答案 2 :(得分:0)
您可以从System.Web.Mvc.Html.EnumHelper.GetSelectList
方法中受益,并使用DropDownListFor
代替EnumDropdownListFor
,如下所示:
@Html.DropDownListFor(m => m.Type, EnumHelper.GetSelectList(typeof(MailTemplateType), Model.Type).OrderBy(t => t.Text))
答案 3 :(得分:-1)
有。
只需按您想要的顺序设置枚举项目即可。像这样:
'// 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...