2014-06-09 98 views
5

我喜歡在MVC 5.1新Html.EnumDropdownListFor,我看,我可以像這樣的顯示屬性中指定的值的順序:Html.EnumDropdownListFor可以按字母順序排列嗎?

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

'訂單'似乎並沒有爲我排序。 – bradlis7

+0

創建一個將Enum轉換爲SelectList的擴展方法。此外,我會建議不使用枚舉,而是使用類,即使他們是KeyValuePair或Tuple。 –

+1

從1開始,你有沒有上帝? – Sinjai

回答

1

有沒有辦法讓MVC自動讓我的DDL按字母順序排列?

我看不出如何。沒有一個重載看起來像任何形式的排序參數,如ASC或DESC。看起來你要麼必須實現自己的EnumDropDownListFor版本,有可能使用EnumDropDownListFor自身,或者使用JavaScript解決方案在事實之後對select元素進行排序。

5

我想出了一個解決方案,獲取枚舉值,對它們進行排序,然後打電話給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); 
}