Sitecore 7.2 MVC和DMS

Sitecore 7.2 MVC和DMS,sitecore,sitecore-dms,sitecore7.2,Sitecore,Sitecore Dms,Sitecore7.2,我正在尝试使用MVC在Sitecore 7.2上设置DMS。我可以通过页面编辑器设置个性化规则,但当我以普通用户的身份查看页面时,这些规则不会运行。我已检查了以下各项: Analytics.Enabled设置为true @Html.Sitecore().VisitorIdentification()已添加到主布局中 分析数据库已设置 日志中未显示任何错误 我已启用配置文件Sitecore.MvcAnalytics.config 已为站点启用分析功能 我的条件在WebForms中有效,只有MVC不

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

  • Analytics.Enabled设置为true
  • @Html.Sitecore().VisitorIdentification()已添加到主布局中
  • 分析数据库已设置
  • 日志中未显示任何错误
  • 我已启用配置文件Sitecore.MvcAnalytics.config
  • 已为站点启用分析功能
  • 我的条件在WebForms中有效,只有MVC不起作用
  • 我们已经将问题缩小到控制器渲染,我们的解决方案适用于视图渲染。是否有人对控制器渲染进行了个性化处理?我们已经在一个vanilla SC实例中复制了这个问题

    以下是我们问题的视频:

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

    以及页面上的组件:


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

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

    <sc:visitoridentification runat="server" /> 
    
    
    

    </head> 
    
    
    

    您是否查看了源代码以查看@Html.Sitecore().VisitorIdentification()是否包含它?

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

    Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering
    
    Sitecore.MvcAnalytics.config
    中可以看到。当它运行时,将触发
    mvc.customizerEntering
    。我想我说的是-个性化在根据渲染类型选择特定渲染器之前发生。您可能希望查看
    Sitecore.Mvc.Analytics
    中的
    Sitecore.Mvc.Analytics.Pipelines.Response.CustomizerOrdering.Personalize
    ,以了解Sitecore如何准确应用您的个性化规则

    我知道我并不是在回答你的问题,但我自己会这么做:

    • 确保有问题的渲染运行其自然过程(例如,您没有创建手动设置
      .Renderer
      渲染
      对象,也没有对MVC上下文进行猴子修补等)
    • 确认外部渲染(如果控制器渲染嵌套在另一个渲染中)未设置为缓存(如果设置为缓存,则在外部渲染兑现后,Sitecore不会再次调用内部渲染上的渲染管道。我知道这很明显,但我看到人们对此感到惊讶)
    • 通过检查已发布项目中项目的
      \u呈现
      字段的原始值,仔细检查个性化规则是否像您认为的那样被记录(个性化设置不会在
      预览
      中运行,仅在
      页面模式.IsNormal
      时运行)
    • 确保从控制器返回时,没有发送最终通过另一个
      渲染渲染管道生成标记的razor视图。例如,如果使用
      RenderingView
      包装它,它将通过自己的管道运行,并将拥有自己的
      RenderingContext
      和自己的
      Rendering
      对象。个性化设置将更改控制器渲染对象上的数据源,并且您的
      @Html.Sitecore().Field()
      可能正在与您需要的
      渲染.Item
      进行对话(在控制器中记录您的
      渲染.Item
      ,并在razor中执行相同操作,以查看发生了什么情况)。上周我在博客中谈到了其中的一些内容(),如果您在页面编辑器中进行调试,您可能会看到呈现管道序列
    • 如果一切看起来都正常,规则仍然神秘地没有触发,我很可能会使用我最近学到的技巧,并将Sitecore置于debug()中。不止一次地帮助我们弄清了事情的真相
    问题 问题是由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表单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;
    }
    
    受保护的覆盖渲染器GetRenderer(渲染渲染,GetRenderArgs args)
    {
    if(args.Rendering.RenderingItem.ID!=IDs.FormMVCinterretId)
    返回base.GetRenderer(渲染,参数);
    Tuple controllerAndAction=this.GetControllerAndAction(呈现,args);
    if(controllerAndAction==null)
    返回(渲染器)null;
    字符串str1=controllerAndAction.Item1;
    字符串str2=controllerAndAction.Item2;
    FormControllerRenderer controllerRenderer=新的FormControllerRenderer();
    controllerRenderer.ControllerName=str1;
    controllerRenderer.ActionName=str2;
    返回(渲染器)控制器渲染器;
    }
    
    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));
    }
    
    公共覆盖无效进程(GetRenderArgs args)
    {
    Assert.ArgumentNotNull((object)args,“args”);
    if(args.Result!=null | | args.Rendering==null | | string.IsNullOrEmpty(args.Rendering[“RenderingXml”]))
    返回;
    CustomizeRenderingArgs args1=新的CustomizeRenderingArgs(args.Rendering);
    args.Result=PipelineService.Get().RunPipeline(“mvc.customizerEntering”,args1,(Func)(管道