Orchard CMS 路由问题

11
我创建了一些自定义内容类型,并包括路由部分以便我的内容管理者可以编辑项目的 slug。我无法配置一个路由,使得我自己的控制器能够为这些项提供请求服务。核心 Routable 模块中的路径到 ItemController 的路由优先级为 10。我尝试了使用 IRouteConstraint 的路由,类似于 Blog 模块实现我想要做的事情,但是优先级较低,但仍然没有成功。如果我让我的 URL 以 / 结尾,则会激活我的自定义路由,因为它不匹配我的内容项的路径。这不是一个理想的解决方案。我不明白它为什么不能在 Routable 模块属于的路由之前发现我的自定义路由。非常感谢您的帮助。更新:以下是我IRouteProvider实现中的GetRoutes方法:
    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提供服务吗?我的唯一选择是使用备选项来呈现自定义形状吗?

Orchard论坛将是我的下一个寻求帮助的地方。再次感谢您提供的任何帮助。


我可以帮你解决这个问题,但我需要更多的细节。你是如何为每个内容项提供slug、route、path和title属性的?如果你的问题只是关于末尾的“/”,那我很抱歉,但我认为你必须处理它。无论如何,你应该考虑在官方的orchard论坛上寻求帮助,那里有官方的orchard团队成员非常活跃:http://orchard.codeplex.com/discussions/ - Proviste
你能发布一下你的RouteProvider.cs文件吗? - mdm
1个回答

7
你也可以从自己的控制器中提供这些项目,当然。唯一需要的是到达您的控制器的路由。然后,您可以返回几乎任何内容 :)
看起来你的URL正在被其他一些路由匹配。如果你想覆盖默认路由并确保你的路由首先进行比较,你应该指定更高的优先级(例如11)。Orchard.Core.Routable.Routes中的通配符路由的优先级为10,因此将捕获与您的路由匹配的URL。
在第一个路由中,您没有为id提供默认值-这也可能会导致问题。如果您没有在URL中明确指定id,则不会匹配它。
顺便问一下,在第一个路由中,“Area”是默认控制器的适当名称还是打字错误?

感谢pszmyd的回答,但是我的路由优先级仍然没有被激活为11。它会匹配“/newcastle/”,但不会匹配“/newcastle”,后者是内容项的RoutePart.Path值。我还做错了其他什么吗?我有一个AreaController用于我的管理员类型屏幕,您认为这不是一个好主意吗? - Brendan
结果证明15是一个神奇的数字。如果设计工具能告诉你当前请求由哪个路由处理,那就太好了。感谢pszmyd,同时也要赞扬他的博客,我发现它非常有用。 - Brendan
@Brendan:路由调试是Orchard真正需要的东西。在http://orchard.codeplex.com/workitem/17287上有一个开放的工单-它得到的投票越多,实现的机会就越大。@Pszmyd:你已经为几乎所有其他可想象的事情编写了模块,为什么不为这个做呢?:-p - mdm
@Piotr,我遇到了同样的问题。我的路由被触发了,但是它给了我一个访问被拒绝的错误。请帮帮我。 - Behnam Esmaili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接