首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sitecore 7.2MVC和DMS

Sitecore 7.2MVC和DMS
EN

Stack Overflow用户
提问于 2014-11-10 15:29:32
回答 3查看 2.3K关注 0票数 2

我正在尝试使用MVC在Sitecore 7.2上设置DMS。我可以通过页面编辑器设置个性化规则,但当我将页面视为正常用户时,这些规则不会运行。我检查了以下情况:

  1. Analytics.Enabled设置为true
  2. @Html.Sitecore().VisitorIdentification()已添加到主布局中
  3. 分析数据库是建立的
  4. 日志中没有显示错误。
  5. 我已经启用了配置文件Sitecore.MvcAnalytics.config
  6. 网站启用了分析功能。
  7. 我的条件在WebForms中工作,只有MVC才不起作用。

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

下面是我们问题的视频:

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

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

以及页面上的组件:

我们试图设置一个最小干扰量的测试。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-22 15:22:51

问题

这个问题是由Sitecore.Forms.Mvc.config文件引起的。我在最初的问题中没有提到WFFM,因为我认为它不会影响DMS。

在不使用WFFM的情况下启用DMS时,getRenderer管道如下所示:

代码语言:javascript
复制
<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,则此管道将更改为:

代码语言:javascript
复制
<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条目在管道开始时插入自己。这会导致问题,因为它返回呈现:

代码语言:javascript
复制
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处理器什么也不做,因为有返回的结果,因此不执行个性化设置:

代码语言:javascript
复制
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,以强制最后加载它。

票数 2
EN

Stack Overflow用户

发布于 2014-11-12 02:18:46

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

代码语言:javascript
复制
Sitecore.Mvc.Analytics.Pipelines.Response.GetRenderer.CustomizeRendering

Sitecore.MvcAnalytics.config来的。当它运行时,它将触发mvc.customizeRendering。我想我要说的是-个人化发生在之前,是根据呈现的类型来选择的。您可能需要查看Sitecore.Mvc.Analytics.Pipelines.Response.CustomizeRendering.PersonalizeSitecore.Mvc.Analytics中的应用情况,以了解Sitecore如何准确地应用您的个性化规则。

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

  • 确保所讨论的呈现运行其自然过程(例如,您没有创建手动设置Rendering.Renderer对象,而不是猴子修补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/)中。不止一次地帮助我们弄清事情的真相。
票数 1
EN

Stack Overflow用户

发布于 2014-11-11 08:36:16

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

代码语言:javascript
复制
<sc:visitoridentification runat="server" /> 

代码语言:javascript
复制
</head> 

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26847157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档