我正在尝试使用MVC在Sitecore 7.2上设置DMS。我可以通过页面编辑器设置个性化规则,但当我将页面视为正常用户时,这些规则不会运行。我检查了以下情况:
我们已经将问题缩小到Controller渲染,我们的解决方案适用于视图呈现。有没有人用控制器渲染来进行个性化设计?我们在一个普通的SC实例中复制了这个问题。
下面是我们问题的视频:
http://screencast.com/t/1nGwUINJLZO
这是我的控制器代码的截图:

以及页面上的组件:

我们试图设置一个最小干扰量的测试。
发布于 2014-12-22 15:22:51
问题
这个问题是由Sitecore.Forms.Mvc.config文件引起的。我在最初的问题中没有提到WFFM,因为我认为它不会影响DMS。
在不使用WFFM的情况下启用DMS时,getRenderer管道如下所示:
<mvc.getRenderer patch:source="Glass.Mapper.Sc.Mvc.config">
<processor type="Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering, Sitecore.Mvc.Analytics" patch:source="Sitecore.MvcAnalytics.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetViewRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetItemRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetXsltRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetControllerRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetMethodRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetUrlRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetDefaultRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
</mvc.getRenderer>您可以在这里看到,第一个条目是一个处理器,它通过分析插入来控制个性化。如果现在启用Sitecore.Forms.Mvc.config,则此管道将更改为:
<mvc.getRenderer patch:source="Glass.Mapper.Sc.Mvc.config">
<processor type="Sitecore.Forms.Mvc.Pipelines.GetFormControllerRenderer, Sitecore.Forms.Mvc" patch:source="Sitecore.Forms.Mvc.config"/>
<processor type="Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering, Sitecore.Mvc.Analytics" patch:source="Sitecore.MvcAnalytics.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetViewRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetItemRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetXsltRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetControllerRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetMethodRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetUrlRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.Response.GetRenderer.GetDefaultRenderer, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
</mvc.getRenderer>注意,WFFM条目在管道开始时插入自己。这会导致问题,因为它返回呈现:
protected override Renderer GetRenderer(Rendering rendering, GetRendererArgs args)
{
if (args.Rendering.RenderingItem.ID != IDs.FormMvcInterpreterID)
return base.GetRenderer(rendering, args);
Tuple<string, string> controllerAndAction = this.GetControllerAndAction(rendering, args);
if (controllerAndAction == null)
return (Renderer) null;
string str1 = controllerAndAction.Item1;
string str2 = controllerAndAction.Item2;
FormControllerRenderer controllerRenderer = new FormControllerRenderer();
controllerRenderer.ControllerName = str1;
controllerRenderer.ActionName = str2;
return (Renderer) controllerRenderer;
}然后,CustomiseRendering处理器什么也不做,因为有返回的结果,因此不执行个性化设置:
public override void Process(GetRendererArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
if (args.Result != null || args.Rendering == null || string.IsNullOrEmpty(args.Rendering["RenderingXml"]))
return;
CustomizeRenderingArgs args1 = new CustomizeRenderingArgs(args.Rendering);
args.Result = PipelineService.Get().RunPipeline<CustomizeRenderingArgs, Renderer>("mvc.customizeRendering", args1, (Func<CustomizeRenderingArgs, Renderer>) (pipelineArgs => pipelineArgs.Renderer));
}原因:
这是由于MVC、Web和Analytics信任被加载的顺序造成的。默认情况下,它们按以下顺序加载:
这是正确的顺序。
解决方案:
解决方案是将Sitecore.Forms.Mvc.Config重命名为y.Sitecore.Forms.Mvc.config,以强制最后加载它。
发布于 2014-11-12 02:18:46
老实说,我不明白这怎么可能是特定于控制器渲染的。在Sitecore中,MVC控制器和视图渲染一样遵循相同的管道路径。更具体地说,选择基于A/B (又名MVT)测试或个性化规则的变化作为mvc.getRenderer管道中的第一步。你应该
Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering从Sitecore.MvcAnalytics.config来的。当它运行时,它将触发mvc.customizeRendering。我想我要说的是-个人化发生在之前,是根据呈现的类型来选择的。您可能需要查看Sitecore.Mvc.Analytics.Pipelines.Response.CustomizeRendering.Personalize在Sitecore.Mvc.Analytics中的应用情况,以了解Sitecore如何准确地应用您的个性化规则。
我知道我不是在回答你的问题,但我自己会这样做:
Rendering的.Renderer对象,而不是猴子修补MVC上下文等等)。__Renderings字段的原始值(个性化设置在Preview中不运行,只有在PageMode.IsNormal中运行),对个性化规则进行记录,就像您认为的那样。renderRendering管道生成标记。例如,如果用RenderingView包装它,它将通过自己的管道运行,并拥有自己的RenderingContext和自己的Rendering对象。个性化将更改控制器呈现对象上的数据源,您的@Html.Sitecore().Field()可能与您需要的Rendering.Item不同(在控制器中记录您的Rendering.Item,并在剃须刀中这样做以查看正在发生的事情)。我上周在博客中提到了其中的一些内容(http://jockstothecore.com/sitecore-mvc-item-maze/),如果您在页面编辑器中调试,您可能会看到呈现管道序列。发布于 2014-11-11 08:36:16
我无法让@Html.Sitecore().VisitorIdentification()工作。我们刚把
<sc:visitoridentification runat="server" /> 在
</head> 您是否查看了您的源代码,以查看@Html.Sitecore().VisitorIdentification()是否包括它?
https://stackoverflow.com/questions/26847157
复制相似问题