Sitecore MVC自定义路由,同时仍使用Sitecore渲染管道

Jon*_*rch 5 c# model-view-controller rendering routes sitecore

我正在使用Sitecore 7.5和Sitecore 8(2个具有相同需求的独立项目).我们将内容项存储在存储桶中,但它们本身不是页面项(它们没有绑定到它们的显示,它们只是数据项,可能来自不同的来源,包括项目存储桶).

所以这里是问题的一般布局:我们想要渲染项目的页面类似于 / sitecore/content/home/news 我们需要能够在项目名称之后解析pathinfo作为控制器渲染的数据有效负载.

所以,到目前为止我所尝试的包括创建这些行的自定义路线:

            routes.MapRoute(
            "Blog", 
            "blog/{*pathInfo}", 
            new
            {
                scItemPath = "/sitecore/content/Home/Blog",
                controller = "Blog",
                action = "DefaultAction"
            });
Run Code Online (Sandbox Code Playgroud)

我从RenderCustomRoutes管道加载路由,并且我已将其配置为在不同的测试尝试中从Sitecore InitializeRoutes管道之前和之后调用.

我在http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/10/using-sitecore-keys-in-mvc-routes-with-中引用了这个. -sitecore-aspnet-cms.aspx和一些相关文章.

接下来的一些其他文章,他修改他的指示或继续解决其他问题并没有解决我的情况.问题是,这一切都不起作用.在这种情况下,控制器被正确调用,但是当我在渲染上下文中获取项目本身时,我没有得到页面其余部分的渲染.有没有办法从这里启动渲染管道,或者使用博客项目的其余演示详细信息来组装页面并手动执行?

我试过的另一条路线就是尝试将pathinfo作为数据传递给现有的博客页面网址,但我最终得到的是404.

我不知道我是不是在这里追逐一只雁,而且还有一种更好的方式,或者我只是在某个地方错过了一块.在Webforms中我可能已经完成了url重写以实现这一点而不使用查询字符串,但我希望路由可以设计为处理这样​​的事情,我看到的文章似乎让我认为它是可能的.

我一直在考虑的其他事情:John West说Sitecore有4种方式来处理MVC请求

1. 忽略请求:允许ASP.NET MVC处理它,就像没有安装Sitecore一样,而不建立Sitecore上下文.

2. 应用路由:使用MVC路由指定的控制器和操作.

3. 应用指定操作:使用上下文项中指定的控制器和操作.

4. 应用视图:使用Sitecore的默认控制器和操作来调用上下文项中上下文设备的布局详细信息中定义的视图.

当我使用自定义路线时,我得到的结果似乎符合#2,但我仍然需要使用自定义路线,更像是#3#4.

jam*_*kam 3

由于您存储桶中的项目没有任何演示文稿,我相信通过路线处理此问题会很棘手。这也许是可能的,希望其他人能插话,但是......

\n\n

您可以使用通配符项目来实现您的尝试。它将取决于组件的确切设置和结构,但只需创建一个名为 的子*/sitecore/content/Home/Blog。然后,您可以在此通配符项目上设置演示文稿详细信息等。

\n\n\n\n

现在任何 url 都会匹配这个项目。您需要在某个时刻解析该项目,它可能位于控制器本身中,您需要解析 URL,然后查找该项目以在渲染中使用。请注意,Context.Item 仍然是通配符 * 项,因此您必须在代码中创建一个新变量,然后填充您的模型:

\n\n
Item requestedItem = Sitecore.Context.Database.GetItem("resolved-path");\nModel.Name = requestedItem.Name;\nModel.MyProperty = requestedItem["My Property"];\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,最好在ItemResolver管道之后解析 Item,然后将 guid 存储在Sitecore.Context.Items字典中:

\n\n
Item requestedItem = Sitecore.Context.Database.GetItem("resolved-path");\nSitecore.Context.Items["wildcard-guid"] = requestedItem.ID.ToString();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,您可以在多个组件中使用它,并将其设置为组件的数据源(来自代码),例如面包屑、主要内容等。从缓存的角度来看,这也是有益的,因为您可以使用 VaryByData 选项启用缓存。如果需要,如果通过设置未找到该项目,您还可以抛出适当的 404 Sitecore.Context.Item = null

\n\n

您还需要能够处理链接生成,因此您需要创建一个 自定义 LinkProvider来生成一些友好的 URL。

\n\n

希望这是有道理的!我必须尽快做类似的事情,这是迄今为止我想到的最好的选择......

\n