Вопрос:

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

Маршрут для путей к ItemController в базовом модуле Routable имеет приоритет 10. Я попытался сделать маршрут, который использует IRouteConstraint, аналогично тому, как модуль Blog достигает того, что я хочу делать, с более низким приоритетом, но до сих пор не повезло.

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

Любая помощь будет принята с благодарностью, большое спасибо заранее.

UPDATE:
Вот мой метод GetRoutes из моей реализации IRouteProvider:

    public IEnumerable<RouteDescriptor> GetRoutes()
    {
        return new[] {
            new RouteDescriptor
            {
                Priority = 0,
                Route = new Route(
                    "Admin/Jugganort/{controller}/{action}/{id}",
                    new RouteValueDictionary {
                                                {"area", "Jugganort"},
                                                {"controller", "Area"},
                                                {"action", "List"}
                                            },
                    new RouteValueDictionary(),
                    new RouteValueDictionary {
                                                {"area", "Jugganort"}
                                            },
                    new MvcRouteHandler())
            },
            new RouteDescriptor
            {
                Priority = 9,
                Route = new Route(
                    "{location}/{merchant}/{promotion}",
                    new RouteValueDictionary {
                                                {"area", "Jugganort"},
                                                {"controller", "Home"},
                                                {"action", "Index"},
                                                {"merchant", UrlParameter.Optional},
                                                {"promotion", UrlParameter.Optional}
                                            },
                    new RouteValueDictionary { 
                        { "location", _routeConstraint }
                    },
                    new RouteValueDictionary {
                                                {"area", "Jugganort"}
                                            },
                    new MvcRouteHandler())
            }
        }; 
    }  

_routeConstraint - это простая реализация IRouteConstraint, которая просто ищет жестко заданное значение "newcastle" для местоположения на маршруте.

Я не понимаю правильное понимание RoutePart? Должны ли эти элементы всегда обслуживаться с помощью модуля Routable Module ItemController? Является ли мой единственный вариант, который пользователь чередует для создания пользовательских фигур?

Оркестровые форумы станут моей следующей точкой вызова. Еще раз спасибо за любую помощь, которую вы можете предоставить.

Ответ 1

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

Похоже, что ваши URL-адреса сопоставляются с некоторыми другими маршрутами.. Если вы хотите переопределить маршрут по умолчанию и убедитесь, что ваш первый будет сравниваться, вы должны указать более высокий приоритет (например, 11). Маршрут catch-all в Orchard.Core.Routable.Routes имеет приоритет 10, поэтому поймает даже URL-адреса, соответствующие вашим маршрутам.

Вы не указали значение по умолчанию для id в первом маршруте, что также может представлять проблему. Если вы явно не укажете идентификатор в URL-адресе, он не будет сопоставлен.

Btw, Area собственное имя для контроллера по умолчанию на первом маршруте или просто опечатка?