2016-05-16 112 views
4

我想在我的小asp.net mvc應用程序中實現自定義排序。那麼有很多可用的插件。但這次我想自己做。ASP.NET MVC:自定義排序

這裏是我的表頭:

<tr> 
    <th> 
     S.No. 
    </th> 
    <th> 
     @Html.ActionLink("UrlTitle", "Index", new { SortOrder = ViewBag.SortOrder == null ? "Asc" : (ViewBag.SortOrder == "Asc"? "Desc":"Asc"), SortBy = "UrlTitle" }) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Url) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.UrlDesc) 
    </th> 

    <th> 
     @Html.DisplayNameFor(model => model.tbl_Category.CategoryName) 
    </th> 
</tr> 

這是動作:

public ActionResult Index(String SortOrder, String SortBy) 
    { 
     ViewBag.SortOrder = SortOrder; 
     ViewBag.SortBy = SortBy; 

     var model = ObjBs.GetAll().Where(x=>x.IsApproved == "A"); 
     switch(SortOrder) 
     { 
      case "Asc": 
       model = model.OrderBy(x => x.UrlTitle); 
       break; 
      case "Desc": 
       model = model.OrderByDescending(x => x.UrlTitle); 
       break; 
     } 
     return View(model); 
    } 

目前,我可以通過UrlTitle排序,並沒有任何問題的。但是如果我想等欄目也進行排序,我寫的是這樣的:

switch(SortBy) 
     { 
      case "UrlTitle": 
       switch(SortOrder) 
       { 
        case "Asc": 
         model = model.OrderBy(x => x.UrlTitle); 
         break; 
        case "Desc": 
         model = model.OrderByDescending(x => x.UrlTitle); 
         break; 
        default: 
         break; 
       } 
       break; 

      case "Category": 
       switch (SortOrder) 
       { 
        case "Asc": 
         model = model.OrderBy(x => x.UrlTitle); 
         break; 
        case "Desc": 
         model = model.OrderByDescending(x => x.UrlTitle); 
         break; 
        default: 
         break; 
       } 
       break; 

      case "URL": 
       switch (SortOrder) 
       { 
        case "Asc": 
         model = model.OrderBy(x => x.UrlTitle); 
         break; 
        case "Desc": 
         model = model.OrderByDescending(x => x.UrlTitle); 
         break; 
        default: 
         break; 
       } 
       break; 

      default: 
       break; 
     } 

因爲我可以通過參數傳遞的列名,而不是寫嵌套的開關,我不能做這樣的事情:

model = model.OrderBy(x => x.SortBy); Or, model = model.OrderBy(SortBy); 

那麼我認爲,當程序運行時,SortBy的值將是columnName。但它似乎並不奏效。

我只是不想重複編寫類似的代碼。我怎樣才能最大限度地減少它或使它更好?

回答

0

如果您不想走反射路線,您應該可以使用dynamic Linq進行查詢。