Ограничения маршрута ASP.NET MVC в формате {ID} - {Slug} - PullRequest
3 голосов
/ 02 апреля 2010

У меня есть маршрут, подобный следующему, в идеале я бы хотел, чтобы он соответствовал:

domain.com / макет / 1-пробковый-это-имя--оф-страницы

        routes.MapRoute(
            "Layout",                                                // Route name
            "layout/{id}-{slug}",                                           // URL with parameters
            new { controller = "Home", action = "Index"}, new {id = @"\d+$"}
        );

Но когда я нажимаю на ссылку, я получаю следующее исключение:

Словарь параметров содержит пустую запись для параметра 'id' ненулевого типа 'System.Int32' для метода 'System.Web.Mvc.ActionResult Index (Int32)' в ....

Вышеуказанный маршрут будет соответствовать следующему:

domain.com / layout / 1-slug или domain.com/layout/1-slug_permalink

Похоже, дефис, отделяющий идентификатор от пули, вызывает проблемы.

1 Ответ

6 голосов
/ 02 апреля 2010

В качестве первого шага обработки модуль маршрутизации выполняет сопоставление шаблона входящего URL с объявленным маршрутом. Это сопоставление с шаблоном является нетерпеливым (поэтому id получает все дефисы до последнего, который отмечает начало параметра slug ). Ограничения (например, \ d +) запускаются после сопоставления с образцом. Итак, что вас сбивает с толку, так это то, что нетерпеливое сопоставление с шаблоном устанавливает id на недопустимое значение, затем оно не соответствует ограничению, в результате чего общий маршрут не совпадает, поэтому конвейер продолжает пытаться сопоставить входящее запрос на следующий маршрут в коллекции.

Лучший (например, самый простой для понимания, не обманный) способ обойти это - сопоставить весь сегмент как параметр idAndSlug , а затем использовать правильное регулярное выражение в контроллере для разделения этой строки обратно. в его id и slug составляющих.

В качестве альтернативы рассмотрите возможность использования косой черты в соответствии с предложением mxmissile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...