2016-05-16 6 views
4

私の小さなasp.net mvcアプリケーションでカスタムソートを実装しようとしています。まあ、利用可能な多くのplginsがあります。しかし、今回は自分でやりたいと思っています。ここで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を使用できるはずです。