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。但它似乎並不奏效。
我只是不想重複編寫類似的代碼。我怎樣才能最大限度地減少它或使它更好?