更改sitecore项目而不重定向

更改sitecore项目而不重定向,sitecore,sitecore8,sitecore7.2,sitecore-mvc,Sitecore,Sitecore8,Sitecore7.2,Sitecore Mvc,我在ItemResolver之后插入了一个自定义管道处理器,在该处理器中,我使用内容编辑器从droplink中选择的新项目覆盖当前上下文项目 如果我通过我的网站和处理器通过正常请求转到该动态项目,并且我更改了上下文项目,它仍然会呈现相同的项目: public override void Process(HttpRequestArgs args) { // some code Context.Item = dropLink.TargetItem; } 奇怪的是,如果我通过ItemAPI发

我在ItemResolver之后插入了一个自定义管道处理器,在该处理器中,我使用内容编辑器从droplink中选择的新项目覆盖当前上下文项目

如果我通过我的网站和处理器通过正常请求转到该动态项目,并且我更改了上下文项目,它仍然会呈现相同的项目:

public override void Process(HttpRequestArgs args)
{
  // some code
  Context.Item = dropLink.TargetItem;
}
奇怪的是,如果我通过ItemAPI发出请求,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,因此该项将使用另一组管道再次解析,因此您需要在其中进行修补

mvc.getPageItem管道中的GetFromRouteUrl处理器将args.Result设置为与请求的URL匹配的项目,然后最终将其设置为Context.item,因此它实际上会根据URL将项目重置回正确的项目,并覆盖您先前所做的更改

您需要向mvc.getPageItem添加一个需要处理器,并使用一些逻辑来检查上下文项是否已被解析

在ItemResolver中更新代码并存储一个布尔值,以指示您已经使用自定义逻辑进行了解析,这样就不必运行解析逻辑两次:

public override void ProcessHttpRequestArgs args { //一些代码 Context.Item=dropLink.TargetItem; Context.Items[custom::itemsolved]=true; } 创建一个新类,用于检查自定义逻辑是否已解析该项:

公共类CheckItemResolved:GetPageItemProcessor { 公共覆盖无效ProcessGetPageItemArgs args args { 如果args.Result==null { var resolved=Sitecore.Context.Items[custom::ItemResolved]; 如果MainUtil.GetBoolresolved,则为false { //项目以前已解决 args.Result=Sitecore.Context.Item; } } 回来 } } 然后将其修补到:

紧随其后的管道是GetFromUrl,它通常会通过重新解析该项来设置args.Result。通过将其设置回Context.Item,处理器将提前中断,而不使用以前的逻辑


您可以找到有关的更多详细信息。

由于您使用的是MVC,因此该项将使用另一组管道再次解析,因此您需要在其中进行修补

mvc.getPageItem管道中的GetFromRouteUrl处理器将args.Result设置为与请求的URL匹配的项目,然后最终将其设置为Context.item,因此它实际上会根据URL将项目重置回正确的项目,并覆盖您先前所做的更改

您需要向mvc.getPageItem添加一个需要处理器,并使用一些逻辑来检查上下文项是否已被解析

在ItemResolver中更新代码并存储一个布尔值,以指示您已经使用自定义逻辑进行了解析,这样就不必运行解析逻辑两次:

public override void ProcessHttpRequestArgs args { //一些代码 Context.Item=dropLink.TargetItem; Context.Items[custom::itemsolved]=true; } 创建一个新类,用于检查自定义逻辑是否已解析该项:

公共类CheckItemResolved:GetPageItemProcessor { 公共覆盖无效ProcessGetPageItemArgs args args { 如果args.Result==null { var resolved=Sitecore.Context.Items[custom::ItemResolved]; 如果MainUtil.GetBoolresolved,则为false { //项目以前已解决 args.Result=Sitecore.Context.Item; } } 回来 } } 然后将其修补到:

紧随其后的管道是GetFromUrl,它通常会通过重新解析该项来设置args.Result。通过将其设置回Context.Item,处理器将提前中断,而不使用以前的逻辑


您可以找到有关的更多详细信息。

您是否可以尝试在itemresolver之前而不是之后进行修补?您的意思是,在同一处理器中,您进行了一些api调用,然后该项确实会受到影响?您还可以执行SelectSingleItem而不是dropLink.TargetItem,是否可以在不使用api调用的情况下测试SelectSingleItem?我不会在处理器中进行api调用,例如,我会从浏览器中为项目发出api调用,在处理器中,我使用随机项更改上下文项,我可以成功更改上下文项。我还使用SelectSingleItem进行了测试,但没有成功。您能尝试在itemresolver之前而不是之后进行修补吗?您的意思是,在同一个处理器中,您进行了一些api调用,然后该项确实受到影响?您还可以执行SelectSingleItem而不是dropLink.TargetItem,是否可以在不使用api调用的情况下测试SelectSingleItem?我不会在处理器中进行api调用,例如,我会从浏览器中为项目发出api调用,在处理器中,我使用随机项更改上下文项,我可以成功更改上下文项。我也用SelectSingleItem进行了测试,但没有成功。见鬼
o、 谢谢你的回答。我使用了bool标志的技巧,现在我在CheckItemResolved类中检查该标志。如果找到已解析的项,我只需执行args.Result=Context.item;。我不知道为什么在您的代码片段中要检查ifargs.Result!=无效的对我来说,结果总是空的,不确定你的代码片段是为了让我理解,还是它是生产代码。再次感谢!太好了,很高兴成功了。我们进行检查,因为它与我们的代码相关,您可能会有所不同,因此需要进行调整。设置args.Result=Context.Item;是完全有效的,但是下一个处理器GetFromOldContext执行完全相同的操作,因此我将其设置为null,但这只是首选项。您好,谢谢您的回答。我使用了bool标志的技巧,现在我在CheckItemResolved类中检查该标志。如果找到已解析的项,我只需执行args.Result=Context.item;。我不知道为什么在您的代码片段中要检查ifargs.Result!=无效的对我来说,结果总是空的,不确定你的代码片段是为了让我理解,还是它是生产代码。再次感谢!太好了,很高兴成功了。我们进行检查,因为它与我们的代码相关,您可能会有所不同,因此需要进行调整。设置args.Result=Context.Item;是完全有效的,但是下一个处理器GetFromOldContext执行完全相同的操作,因此我将其设置为null,但这只是首选项。