Карта маршрутов для пагинации в MVC - PullRequest
4 голосов
/ 22 декабря 2010

Я использую класс Pagination, очень похожий на класс, используемый в примере NerdDinner.Аспект нумерации страниц работает хорошо, но я изо всех сил пытаюсь заставить все маршруты работать должным образом.

В настоящее время у нас есть один MapRoute набор:

        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
        );

Мы хотим, чтобы URL был вместо/mycontroller/myaction/1/5, чтобы быть /mycontroller/myaction/1/page5, так что это имеет больше смысла для пользователя.Я не могу найти способ сделать это в данный момент.

Во-вторых, как мы настраиваем маршруты, чтобы действия могли использоваться и с нумерацией страниц.Т.е. /controller/page1 вместо /controller/index/page1

1 Ответ

1 голос
/ 22 декабря 2010

У вас должно быть два маршрута:

Сначала для нумерации страниц (будут использоваться контроллер по умолчанию и действие):

    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
...