如何忽略Orchard的部分路线?

时间:2014-03-21 13:34:29

标签: routing orchardcms

如何设置自定义路由以忽略ID之后的所有内容?

Autoroute似乎是在创建别名并将其保存到数据库时设置别名,因此它不会忽略任何内容,它必须完全匹配。 IRouteProvider似乎是模块控制器,我想使用默认的内容控制器。

所以基本上,我想创建像

这样的动作网址
test/{Content.Id}/{Content.Slug}

我想在id上匹配,所以

test/{Content.Id}

并且同时忽略id之后的任何内容,这可能与原始的slug不匹配,所以

test/{Content.Id}/what/ever/garbage/gets/passed

例如,请查看SO如何管理此网址: https://stackoverflow.com/questions/22560272/aldjg%20jadf%20jg/adjf%20gadf%20g

同样,我想使用默认的Orchard Content Type控制器(至少尽可能长)。

2 个答案:

答案 0 :(得分:1)

您可能必须使用IRouteConstraint 如果通过"内容类型控制器",则表示:部件驱动程序。是完全一样的。 您可以执行任何操作来验证URL,然后调用_contentManager.BuildDisplay(contentItem);

答案 1 :(得分:0)

我通过在我的模块/ w中添加一个Routes类来解决这个问题:

public class Routes : IRouteProvider
{
    public void GetRoutes(ICollection<RouteDescriptor> routes)
    {
        var routeDescriptors = GetRoutes();
        foreach (var descriptor in routeDescriptors)
            routes.Add(descriptor);
    }

    public IEnumerable<RouteDescriptor> GetRoutes()
    {
        return new[] {
            new RouteDescriptor {
                Name= "PostIdRoute",
                Route = new Route(
                    "post/{id}/{*SeoFluff}",
                    new RouteValueDictionary{
                        {"area", "Contents"},
                        {"controller", "Item"},
                        {"action", "Display"}
                    },
                    new RouteValueDictionary(),
                    new RouteValueDictionary { {"area", "Contents"} },
                    new MvcRouteHandler()
                )
            }
        };
    }
}

注意&#34; {* SeoFluff}&#34;部分。该通配符是处理未知数量的斜杠的关键,如果你不包含它,你需要添加多个RouteDescriptors。