У вас должно быть два маршрута:
Сначала для нумерации страниц (будут использоваться контроллер по умолчанию и действие):
routes.MapRoute(
"Default", // Route name
"home/{id}/{page}", // URL with parameters
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional,
page = UrlParameter.Optional
} // Parameter defaults
);
Последний маршрут для всех контроллеров:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}/{page}", // URL with parameters
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional,
page = UrlParameter.Optional
} // Parameter defaults
);
Таким образом, с указанными выше маршрутами / home / 1 / page5 будет обрабатываться индексным действием home controller,
но someController / someAction / 1 / page5 по второму маршруту.
Вы должны знать, что сначала вам нужно разместить маршруты, которые обрабатывают меньше URL-адресов и, чем - общие маршруты, как второй маршрут выше для всех контроллеров.
Также внутри действия контроллера вы можете повторно просмотреть параметр маршрута следующим образом:
string page = RouteData.Values["page"];
, поэтому для URL home / 1 / page5 в примере выше страница будет равна 'page5', чем вы можете проанализировать эту строку для получения номера страницы.
Что касается меня, я использую следующий метод для получения параметров из данных маршрута, тела сообщения, строки запроса:
protected T GetQueryParam<T>(String name, T defValue = default(T))
{
String param = HttpContext.Request.QueryString.Get(name);
if (String.IsNullOrEmpty(param))
param = HttpContext.Request.Params[name];
if ( String.IsNullOrEmpty(param))
param = (String) RouteData.Values[name] ?? String.Empty;
if (String.IsNullOrEmpty(param) )
return defValue;
return (T)Convert.ChangeType(param, typeof(T));
}
Итак, если вам нужно получить страницу, используя вышеуказанный метод, вам просто нужно сделать следующее:
var page = GetQueryParam<string>("page");// in case if page parameter not exists default value for type will be returned