Sitecore 7.2 MVC和DMS

时间:2014-11-10 15:29:32

标签: sitecore sitecore-dms sitecore7.2

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

  1. Analytics.Enabled设置为true
  2. @ Html.Sitecore()。VisitorIdentification()已添加到主布局
  3. 分析数据库已设置
  4. 日志中未显示任何错误。
  5. 我启用了配置文件Sitecore.MvcAnalytics.config
  6. 为网站启用了分析。
  7. 我的条件在WebForms中起作用,只有MVC不起作用。
  8. 我们已将问题缩小到Controller Renderings,我们的解决方案适用于View Renderings。是否有人使用Controller Renderings进行个性化设计?我们在一个vanilla SC实例中复制了这个问题。

    以下是我们问题的视频:

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

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

    enter image description here

    页面上的组件:

    enter image description here

    我们尝试以最小的干扰设置测试。

3 个答案:

答案 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窗体和分析配置的顺序引起的。默认情况下,它们按以下顺序加载:

  1. Sitecore.Forms.Mvc.config
  2. Sitecore.Mvc.config
  3. Sitecore.MvcAnalytics.config
  4. 这是正确的顺序。

    解决方案:

    解决方案是将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上下文,等)
  • 确认外部渲染(如果您的控制器渲染嵌套在另一个渲染中)未设置为缓存(如果是,Sitecore不会调用内部的渲染管道)一旦外部渲染被兑现,渲染效果再次呈现。我知道它很明显,但我看到有人对此感到惊讶)
  • 通过检查已发布项目中项目__Renderings字段的原始值,仔细检查个性化规则的记录方式与您认为的一样(个性化不会在{{1}中运行},仅在Preview)时运行。
  • 当您从控制器返回时,请确保您没有发送最终通过另一个PageMode.IsNormal管道生成标记的剃刀视图。例如,如果用renderRendering包装它,它将运行自己的管道,并拥有自己的RenderingView和它自己的RenderingContext对象。个性化将更改控制器呈现对象上的数据源,而Rendering可能正在与您需要的@Html.Sitecore().Field()对话(在控制器中记录您的Rendering.Item并在剃刀中执行相同操作看看发生了什么。我上周在博客上写了一些内容(http://jockstothecore.com/sitecore-mvc-item-maze/),如果你在页面编辑器中调试,你可能会看到渲染管道序列。
  • 如果一切看起来都正确并且规则仍然神秘地消失,我很可能会使用我最近学到的技巧并将Sitecore置于调试(http://bilyukov.com/debugging-sitecore-dotpeek/)。不止一次地帮助了解事物。

答案 2 :(得分:0)

我无法获得@ Html.Sitecore()。VisitorIdentification()。我们只是把

<sc:visitoridentification runat="server" /> 

之前的

</head> 

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