Можно ли передать номера страниц, которые будут повторять местоположение сегмента маршрута? - PullRequest
0 голосов
/ 07 марта 2012

Скажем, я буду передавать ниже запросы URL в систему маршрутизации, это самый длинный возможный URL.

store / storecontent / pets / cat / food / 1

Где "1"это номер страницы и домашние животные это корневой указатель

Теперь моя запись маршрута выглядит так:

    routes.MapRoute(
    "StoreContent", // Route name
    "{controller}/{action}/{rootpointer}/{category}/{category2}/{page}", // URL with parameters
    new { rootpointer = UrlParameter.Optional, category= UrlParameter.Optional, category2 =     UrlParameter.Optional, page = UrlParameter.Optional},
new { controller = "Store", action = "StoreContent" });

Мой метод выглядит так:

public PartialViewResult StoreContent(string rootpointer, string category, string category2, int page) {}

проблема заключается в том, что когда я передаю URL-адрес, например store / storecontent / pets / 1 , тогда категории присваивается значение "page", понятно, поскольку страница теперь расположена в месте сегмента маршрута, зарезервированного для категории, и система маршрутизации не имеет никакого способасказать, какое значение принадлежит странице, а какое категории, так как это анонимные типы.

Есть ли способ обойти это, я понимаю, что это можно сделать вручную, используя catchall и анализируя его для извлечения значений, но есть ли более изящное решение, которое не требует какого-либо ручного вмешательства?Я также мог бы, вероятно, просто использовать что-то вроде /page-{page}/, если мой URL отражает это, тогда система маршрутизации должна подобрать его для анонимного типа страницы и правильно присвоить его значение параметру страницы в методе?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Это не тот способ, которым работает маршрутизация

Если вы определяете маршрут как

{controller}/{action}/{rootpointer}/{category}/{category2}/{page}

, а затем получаете доступ к своей странице, используя store / storecontent / pets / 1 тогда параметры вашего маршрута следующие:

  • контроллер = магазин
  • action = storecontent
  • rootpointer = pets
  • category = 1
  • category2 = null
  • page = null

На самом деле вы пытаетесь store / storecontent / pets /// 1 , ноВы не можете предоставить такие URL

RESTful?

Это также не RESTful.Зачем?Поскольку предоставление страницы как части вашего URL-адреса возвращает возможно недетерминированные результаты ...

Именно поэтому подкачка и сортировка должны (в терминах REST) ​​предоставляться как переменные запроса, как в store/ storecontent / домашние животные? страница = 1 .Это, конечно, сработает.Они становятся произвольными переменными, не относящимися к маршрутизации как таковой.Попробуйте, если это также работает для вашего определения маршрута, потому что это может также работать, так как многие из ваших сегментов маршрута являются необязательными.

Возможное решение 1

Возможное решение (хотя я бы посоветовал вам сохранитьподкачка как переменная запроса) будет определять несколько маршрутов:

{controller}/{action}/{page}
{controller}/{action}/{rootpointer}/{page}
{controller}/{action}/{rootpointer}/{category}/{page}
{controller}/{action}/{rootpointer}/{category}/{category2}/{page}

каждому из них потребуются ограничения на page = "\d+", поэтому маршрутизация будет продолжаться до тех пор, пока не будет получен правильный.

Возможное решение 2

Сохраняя страницу как отдельный параметр запроса, никто не сказал, что вы не можете определить его как часть значений по умолчанию:

routes.MapRoute(
    "Some route",
    "{controller}/{action}/{rootpointer}/{category}/{category2}",
    new {
        rootpointer = UrlParameter.Optional,
        category= UrlParameter.Optional,
        category2 = UrlParameter.Optional,
        page = 1
    }
);

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

Дополнительное наблюдение

Если вы предоставляете ограничения констант для одного значения для контроллера и действия, нет необходимости сохранять их в определении маршрута в качестве значений маршрута так, как вы это делали.Ваш текущий маршрут, как он определен в данный момент, будет лучше:

routes.MapRoute(
    "StoreContent", // Route name
    "Store/StoreContent/{rootpointer}/{category}/{category2}/{page}", // URL with parameters
    new {
        controller = "Store",
        action = "StoreContent",
        rootpointer = UrlParameter.Optional,
        category = UrlParameter.Optional,
        category2 = UrlParameter.Optional,
        page = UrlParameter.Optional
    }
    // no need for constraints
);
1 голос
/ 07 марта 2012

Вам необходимо добавить еще один маршрут и ограничение регулярного выражения для переменной вашей страницы

...