2016-05-16 98 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进行查询。