本文介绍了在不重定向的情况下更改Sitecore项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在ItemResolver之后插入了一个自定义管道处理器,在该处理器中,我用内容编辑器从拖放链接中选择的新项覆盖当前上下文项。
如果我通过网站和处理器通过普通请求转到动态项,并更改上下文项,它仍会呈现相同项:
public override void Process(HttpRequestArgs args)
{
// some code
Context.Item = dropLink.TargetItem;
}
奇怪的是,如果我通过Item API发出请求,Sitecore会成功更改项目
//api call
Context.Item = Context.Database.SelectSingleItem("fast:/sitecore/content/mysite/dynamicitem");
这是我的配置文件:
<pipelines>
<httpRequestBegin>
<processor patch:after="* @type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="MyDll.Web.Pipelines.LandingPageResolver,MyDll.Web" />
</httpRequestBegin>
</pipelines>
mvc
由于您使用的是推荐答案,因此(再次)使用一组不同的管道来解析该项,因此您需要改为将其修补到其中。
GetFromRouteUrl
管道中的GetFromRouteUrl
处理器将args.Result
设置为与请求的URL匹配的项目,然后最终设置为Context.Item
,因此它实际上会根据URL将项目重置回"正确"的项目,并覆盖您先前所做的更改。
您需要向mvc.getPageItem
添加一个需要的处理器,并使用一些逻辑检查上下文项是否已解析。
更新ItemResolver中的代码并存储一个布尔值,以指示您已使用自定义逻辑进行解析,这样就不必运行解析逻辑两次:
public override void Process(HttpRequestArgs args)
{
// some code
Context.Item = dropLink.TargetItem;
Context.Items["custom::ItemResolved"] = true;
}
创建检查自定义逻辑是否已解析项目的新类:
public class CheckItemResolved: GetPageItemProcessor
{
public override void Process(GetPageItemArgs args)
{
if (args.Result == null)
{
var resolved = Sitecore.Context.Items["custom::ItemResolved"];
if (MainUtil.GetBool(resolved, false))
{
// item has previously been resolved
args.Result = Sitecore.Context.Item;
}
}
return;
}
}
然后打补丁:
<pipelines>
<mvc.getPageItem>
<processor type="MyProject.Custom.Pipelines.CheckItemResolved, MyProject.Custom"
patch:before="*[@type='Sitecore.Mvc.Pipelines.Response.GetPageItem.GetFromRouteUrl, Sitecore.Mvc']" />
</mvc.getPageItem>
</pipelines>
紧跟在GetFromFromUrl()
之后的管道是args.Result
,它通常会通过重新解析项目来设置args.Result
。通过将其设置回Context.Item,该处理器将提早中断,而不会影响您以前的逻辑。您可以找到有关MVC and Pipelines in the documentation的更多详细信息。
这篇关于在不重定向的情况下更改Sitecore项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!