【问题标题】:Sitecore 7.2 MVC and DMSSitecore 7.2 MVC 和 DMS
【发布时间】:2014-11-10 15:29:32
【问题描述】:

我正在尝试使用 MVC 在 Sitecore 7.2 上设置 DMS。我可以通过页面编辑器设置个性化规则,但是当我以普通用户的身份查看页面时,这些规则不会运行。我检查了以下内容:

  1. Analytics.Enabled 设置为 true
  2. @Html.Sitecore().VisitorIdentification() 已添加到主布局中
  3. 分析数据库已设置
  4. 日志中未显示任何错误。
  5. 我已启用配置文件 Sitecore.MvcAnalytics.config
  6. 已为该站点启用分析。
  7. 我的条件适用于 WebForms,只有 MVC 不起作用。

我们已将问题缩小到控制器渲染,我们的解决方案适用于视图渲染。有没有人使用控制器渲染进行个性化工作?我们已经在一个普通的 SC 实例中复制了这个问题。

这是我们问题的视频:

http://screencast.com/t/1nGwUINJLZO

这是我的控制器代码的截图:

以及页面上的组件:

我们已尝试设置干扰最少的测试。

【问题讨论】:

  • 是否存在不运行的特定类型的规则?还是没有人跑?
  • 如果你在视图中添加一个快速的“println”类语句,你能否输出当前用户的信息,看看它是否确实解析了访问者身份?
  • 可以肯定的是,包含文件夹中有以下配置: 1- Sitecore.Analytics.config 2- Sitecore.Analytics.ExcludeRobots.config 另外,运行此 SQL 查询是否有任何结果:从 [页面] 中选择 *
  • 数据正在进入数据库
  • 虽然我确实找到了a bug with MVC & A/B testing,但我对个性化没有任何问题。你能发布你的控制器代码吗?

标签: sitecore sitecore-dms sitecore7.2


【解决方案1】:

问题

问题是由 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 表单和 Analytics 配置的加载顺序引起的。默认情况下,它们按以下顺序加载:

  1. Sitecore.Forms.Mvc.config
  2. Sitecore.Mvc.config
  3. Sitecore.MvcAnalytics.config

这是正确的顺序。

解决方案:

解决方案是将 Sitecore.Forms.Mvc.Config 重命名为 y.Sitecore.Forms.Mvc.config 以强制最后加载。

【讨论】:

  • 如果 WFFM 配置位于子文件夹中也很好,这样它们将在所有标准产品配置之后进行处理。
【解决方案2】:

老实说,我不明白它是如何特定于控制器渲染的。在 Sitecore MVC 控制器和视图渲染中都遵循相同的管道路径。更具体地说,选择基于 A/B(又名 MVT)测试或个性化规则的变体作为mvc.getRenderer 管道的第一步。你应该有

Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering

来自Sitecore.MvcAnalytics.config。当它运行时会触发mvc.customizeRendering。我想我的意思是 - 个性化发生在根据您的渲染类型选择特定渲染器之前。您可能需要查看Sitecore.Mvc.Analytics 中的Sitecore.Mvc.Analytics.Pipelines.Response.CustomizeRendering.Personalize,以了解 Sitecore 如何准确地应用您的个性化规则。

我知道我本身并没有回答你的问题,但这是我自己会做的:

  • 确保有问题的渲染运行其自然过程(例如,您没有创建一个手动设置 .RendererRendering 对象,而不是 猴子修补 MVC 上下文等)
  • 确认外部渲染(如果您的控制器渲染在另一个渲染中嵌套)未设置为缓存(如果是,Sitecore 不会再次调用内部渲染上的渲染管道一旦外部渲染被兑现。我知道这很明显,但我看到人们对此感到惊讶)
  • 通过检查已发布项目中项目__Renderings 字段的原始值,仔细检查个性化规则是否像您认为的那样记录(个性化不在Preview 中运行,仅在PageMode.IsNormal 时运行) .
  • 确保当您从控制器返回时,您没有通过另一个renderRendering 管道发送最终生成标记的剃刀视图。例如,如果您使用RenderingView 包装它,它将通过自己的管道运行,并拥有自己的RenderingContext 和自己的Rendering 对象。个性化将更改控制器渲染对象上的数据源,并且您的 @Html.Sitecore().Field() 可能正在与您需要的不同 Rendering.Item 交谈(在您的控制器中记录您的 Rendering.Item 并在您的剃须刀中执行相同操作以查看发生了什么)。上周我在博客上写了一些(http://jockstothecore.com/sitecore-mvc-item-maze/),如果您在页面编辑器中调试,您可能会看到渲染管道序列。
  • 如果一切看起来都正确并且规则仍然神秘地没有触发,我很可能会使用我最近学到的技巧并将 Sitecore 置于调试状态 (http://bilyukov.com/debugging-sitecore-dotpeek/)。不止一次地帮助弄清了事情的真相。

【讨论】:

    【解决方案3】:

    我无法让@Html.Sitecore().VisitorIdentification() 工作。我们只是把

    <sc:visitoridentification runat="server" /> 
    

    之前

    </head> 
    

    您是否查看过您的来源以查看 @Html.Sitecore().VisitorIdentification() 是否包含它?

    【讨论】:

    • sc: 是您将在 WebForms 布局中使用的控件。 @Html 是您将在 MVC 布局中使用的剃刀助手。您不能真正将两者混合在一起或期望一个被另一个使用(好吧,从技术上讲,您可以在两个渲染引擎之间进行互操作,但您的答案表明存在直接依赖关系。这可能就是您无法获得的原因@Html 工作...在 .aspx 页面上。在带有 Sitecore MVC 的 .cshtml 上尝试)
    • 谢谢,我们只使用mvc。我知道你不应该使用它,但我们必须使用它来运行分析。我搜索了一下,发现你必须包含@using sitecore.mvc.analytics.extensions 才能让它从一个友好的灵魂中工作,但没有来自 Sitecore 的文档:)。我们会尝试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多