Orgard CMS вопрос маршрутизации - PullRequest
11 голосов
/ 27 июня 2011

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

Маршрут для путей к 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? Будут ли эти элементы всегда обслуживаться из ItemController маршрутизируемого модуля? Является ли мой единственный вариант для пользователя альтернативы для визуализации пользовательских фигур?

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

1 Ответ

7 голосов
/ 28 июня 2011

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

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

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

Кстати, Area - правильное имя контроллера по умолчанию в первом маршруте или просто опечатка?

...