我正在尝试使用MVC在Sitecore 7.2上设置DMS。我可以通过页面编辑器设置个性化规则,但是当我以普通用户身份查看页面时,规则不会运行。我检查了以下内容:
我们已将问题缩小到Controller Renderings,我们的解决方案适用于View Renderings。是否有人使用Controller Renderings进行个性化设计?我们在一个vanilla SC实例中复制了这个问题。
以下是我们问题的视频:
http://screencast.com/t/1nGwUINJLZO
这是我的控制器代码的屏幕截图:
页面上的组件:
我们尝试以最小的干扰设置测试。
答案 0 :(得分:2)
问题是由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 Forms MVC条目会在管道的开头插入。这会导致问题,因为它会返回渲染:
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窗体和分析配置的顺序引起的。默认情况下,它们按以下顺序加载:
这是正确的顺序。
解决方案是将Sitecore.Forms.Mvc.Config重命名为y.Sitecore.Forms.Mvc.config以强制它最后加载。
答案 1 :(得分:1)
我不知道如何将控制器渲染特定为具体。在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
字段的原始值,仔细检查个性化规则的记录方式与您认为的一样(个性化不会在{{1}中运行},仅在Preview
)时运行。PageMode.IsNormal
管道生成标记的剃刀视图。例如,如果用renderRendering
包装它,它将运行自己的管道,并拥有自己的RenderingView
和它自己的RenderingContext
对象。个性化将更改控制器呈现对象上的数据源,而Rendering
可能正在与您需要的@Html.Sitecore().Field()
对话(在控制器中记录您的Rendering.Item
并在剃刀中执行相同操作看看发生了什么。我上周在博客上写了一些内容(http://jockstothecore.com/sitecore-mvc-item-maze/),如果你在页面编辑器中调试,你可能会看到渲染管道序列。 答案 2 :(得分:0)
我无法获得@ Html.Sitecore()。VisitorIdentification()。我们只是把
<sc:visitoridentification runat="server" />
之前的
</head>
您是否查看过您的来源,看看@ Html.Sitecore()。VisitorIdentification()是否包含它?