Search code examples
sitecoresitecore-dmssitecore7.2

Sitecore 7.2 MVC and DMS


I am trying to setup DMS on Sitecore 7.2 using MVC. I am able to set personalization rules via the Page Editor but the rules do not run when I view the page as a normal users. I have checked the following:

  1. Analytics.Enabled is set to true
  2. @Html.Sitecore().VisitorIdentification() has been added to the main layout
  3. The analytics DB is setup
  4. No errors are showing in the logs.
  5. I have enabled the config file Sitecore.MvcAnalytics.config
  6. analytics is enabled for the site.
  7. My conditions work in WebForms, it is only MVC that doesn't work.

We have narrowed the problem down to Controller Renderings, our solution works for View Renderings. Has anyone made personalisation work with Controller Renderings? We have replicated this problem in a vanilla SC instance.

Here is a video of our problem:

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

This is a screenshot of my controller code:

enter image description here

And the components on the page:

enter image description here

We have tried to setup a test with the minimum amount of interference.


Solution

  • Problem

    The problem was caused by the Sitecore.Forms.Mvc.config file. I hadn't mentioned WFFM in my original question because I assumed that it wouldn't affect DMS.

    When you enable DMS without WFFM the getRenderer pipeline looks like this:

    <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>
    

    You can see here that the first entry is a processor that analytics inserts to control personalisation. If we now enable the Sitecore.Forms.Mvc.config this pipeline changes to this:

    <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>
    

    Notice that the WFFM Forms MVC entry inserts itself at the start of the pipeline. This causes problems because it returns a rendering:

    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;
    }
    

    The CustomiseRendering processor then does nothing because there is a returned result, therefore no personalization is performed:

    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));
    }
    

    Cause:

    This is caused by the order that the MVC, Web Forms and Analytics configs are loaded. By default they are loaded in this order:

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

    This is the correct order.

    Solution:

    The solution is to rename the Sitecore.Forms.Mvc.Config to y.Sitecore.Forms.Mvc.config to force it to be loaded last.