Я использую атрибутную маршрутизацию в приложении MVC 5 на контроллере, который используется для получения списка и выполняет поиск, сортировку и разбиение на страницы:
[HttpGet]
[Route("Admin/UserList/{searchBy?}/{search?}/{page?}/{sortBy?}")]
public ActionResult AdminUserList(string searchBy, string search, int?
page, string sortBy)
{
IEnumerable<Employee> employees=new List<Employee>();
string emailid=Session["EmailId"].ToString();
var role = (from users in db.Employees where users.EmailId ==
emailid select users.Role).SingleOrDefault();
if (role==Roles.superAdmin)
{
employees = (from users in db.Employees where users.Role ==
Roles.user || users.Role == Roles.admin select
users).AsEnumerable();
}
else
{
employees = (from users in db.Employees where users.Role == Roles.user select users).AsEnumerable();
}
ViewBag.NameSort = String.IsNullOrEmpty(sortBy) ? "Name desc" : "";
if (searchBy == "Email ID")
{
employees = employees.Where(x => search == null || x.EmailId.Contains(search));
}
else
{
employees = employees.Where(x => search == null || x.Name.Contains(search));
}
switch (sortBy)
{
case "Name desc":
employees = employees.OrderByDescending(x => x.Name);
break;
default:
employees = employees.OrderBy(x => x.Name);
break;
}
return View(employees.ToPagedList(page ?? 1, 6));
}
Для URL - rootURL / Admin / UserList / name - он работает нормально и извлекает весь список пользователей по имени, поскольку {search} = null.
Но если пользователь хочет отсортировать по «Name desc», то URL будет - rootURL / Admin / UserList / name / Name% 20desc,
в этих нескольких параметрах, таких как {page}, {search} не указан в URL и как контроллер распознает то же самое.
Я пытался предоставить два разных маршрута для контроллера, но он будет принимать много комбинаций.
Нравится -
[Маршрут ( "Администратор / UserList / {searchBy?} / {Искать?} / {SortBy?}")]
[Маршрут ( "Администратор / UserList / {searchBy?} / {Искать?} / {Страница?} / {SortBy?}")]
и так далее ...
Как мы отобразим этот запрос оптимальным образом -
RootUrl / Admin / UserList / name / t / Name% 20desc
т.е. искать, если имя имеет букву "t" и показывать результат путем сортировки имени в порядке убывания.
Также, как я буду отображать запрос на тот же контроллер, используя бритву?
@Html.PagedListPager(Model, page => Url.Action("UserList", new
{
page,
searchBy = Request.QueryString["searchBy"],
search = Request.QueryString["search"],
sortBy = Request.QueryString["sortBy"]
}),
new PagedListRenderOptions() { Display =
PagedListDisplayMode.IfNeeded, DisplayPageCountAndCurrentLocation =
true })
Спасибо за вашу помощь.