2013-12-10 17 views
0

我的任務是對combobox不區分大小寫的產品項列表進行排序。在combobox中不區分大小寫的項目(SelectList)

鑑於文件:

@Html.DropDownListFor(m => m.ProductId, ViewData["Products"] as SelectList, 
        @Resources.App_GlobalResources.Resource.Common_SelectItem) 

在控制器我試圖2個實施方式:

1)

var products = new SelectList(GetProducts().OrderBy(a => a, new CaseInsensitiveComparer()), 
           "id", "name", selectedProductId); 
ViewData["Products"] = products; 

public class CaseInsensitiveComparer : IComparer<Product> 
{ 
    public int Compare(Product productX, Product productY) 
    { 
    return string.Compare(productX.Name,productY.Name,StringComparison.OrdinalIgnoreCase); 
    } 
} 

2)

var orderedProducts = GetProducts().OrderBy(p => p.Name.ToLower()).ToList(); 
var products = new SelectList(orderedProducts, "id", "name", selectedProductId) 
ViewData["Products"] = products; 

預計:列表排序不區分大小寫 現在:列表排序區分大小寫

但預期任何實施不起作用。有任何想法嗎?提前致謝。

+2

如果如預期它不工作,(1)它是如何工作的;(2)是什麼預期? –

+0

我已經更新了這個問題 –

+1

你的代碼對我來說很不錯。你確定你沒有得到這個結果,因爲你接收數據的順序? –

回答

0

嘗試創建了自己的助手進行排序:

public static class HtmlExtensions 
{ 
    public static IHtmlString DropDownListForSorted<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression, 
     IEnumerable<SelectListItem> items, 
     object htmlAttributes 
    ) 
    { 
     var model = helper.ViewData.Model; 
     var orderedItems = items.OrderBy(x => x.Text); // or x => x.Value 
     return helper.DropDownListFor(
      expression, 
      new SelectList(orderedItems, "Value", "Text"), 
      htmlAttributes 
     ); 
    } 
} 

用法:

@Html.DropDownListForSorted(
    x => x.SelectedItem, 
    Model.Items, 
    new { id = "mylist" } 
) 
+0

這似乎相當不必要?爲什麼不通過排序列表到標準DropDownlistFor – Moeri

+0

是的,你可以做到。但是你必須傳遞一個SelectListItem的排序列表。這就是爲什麼這個幫手是有用的。我更新了代碼,將排序從x.Value更改爲x.Text –