Проблема маршрутизации MVC - попытка подобрать остаток после дефиса в маршруте - PullRequest
2 голосов
/ 29 июля 2011

Я создал следующий маршрут:

routes.MapRoute(
   "Notes 1", // Route name
   "{book}-{id}", // URL with parameters
   new { controller = "Notes", action = "Note", id = UrlParameter.Optional }
);

Используя этот URL и средство проверки маршрута MVC:

http://127.0.0.1:81/java-abcd-efg

id < efg
book < java-abcd
controller < Notes
action < Note

Я ожидал, что книга будет содержать «java», а idсодержат "abcd-efg".Может кто-нибудь объяснить, что не так и почему это не так.

Спасибо

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Проблема в том, что вы не сказали MVC ожидать более одного тире;поэтому он схватил найденное и попытался разобрать его таким образом.

Что ж, это просто отстой для нас.

Если вы знаете, что ваш маршрут всегда будет:

{book}-{name}-{perhapsMoreName-{maybeEvenMore}

Тогда мы справимся с этим, но для анализа этого потребуется работа на стороне сервера.

Поверьте мне, было бы гораздо проще использовать косую черту.Если кто-то приходит к вам и жалуется на SEO, попросите его показать вам точное место, где это важно (и почему-то не работают слэши).Я не говорю, что они не правы, но есть много «Я думаю, что это работает с SEO», и это быстро раздражает.

Я собираюсь предложить вам два решения.Решение 1 было бы способом, которым я бы справился (и боролся за него), а решение 2 было бы решением вашей конкретной проблемы с вашей текущей схемой обработки (и я имел дело с решением 2 на практике, и в лучшем случае это очень неприглядно).

Решение 1

Настройте свои маршруты, аналогично тому, как Stack Overflow настраивает их.Это позволило бы вашему SEO-парню иметь свою освященную SEO-систему, и вы получите то, что вы хотите: без язв.

Ваши URL-адреса изменится и будут выглядеть так:1026 *

Затем вы можете использовать bookName для отображения, но не использовать его для получения какого-либо кода.Просто измените ваш метод Show, чтобы получать элементы по их идентификатору.

Решение 2

Это решение использует ActionFilter для перехвата запросов и анализа того, что к чему.Это странное решение, но оно должно работать.

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

0 голосов
/ 29 июля 2011

Похоже, что механизм маршрутизации вычисляет сначала с правой стороны. Я должен сказать, что ваш дизайн маршрута не велик. По сути, наличие одного и того же персонажа для разделения частей маршрута, а также в пределах одной части маршрута - это большая проблема. Можете ли вы заменить дефис на что-то другое? Я бы сделал это так:

routes.MapRoute(
   "Notes 1", // Route name
   "{book}/{id}", // URL with parameters
   new { controller = "Notes", action = "Note", id = UrlParameter.Optional }
);

, что приведет к этому (все еще может содержать дефис внутри идентификатора):

http://127.0.0.1:81/java/abcd-efg

id < abcd-efg
book < java
controller < Notes
action < Note
...