登录后刷新 Sitecore 渲染

Refresh a Sitecore rendering after logon

我觉得这应该是显而易见的,但我很难过。我们是 运行 带有 MVC 的 Sitecore 7.1。

有一个 Header 呈现,其中包含取决于 Sitecore.Context.IsLoggedIn 状态的条件逻辑。工作正常。

还有第二个呈现,要么允许用户登录,要么显示帐户信息。当 [HttpGet] 动作被调用时,控制器检查 IsLoggedIn 和 returns 两个视图之一。当调用 [HttpPost] 操作时(即当用户登录时),控制器调用 AuthenticationManager.Login() 然后 returns 带有帐户信息的视图。工作正常。

这是一个简单的解决方案,允许我们在页面上放置一个渲染,并且效果很好,除了一件事:header 渲染仍然在登录后立即显示 not-logged-in 内容.

header 渲染和演示细节中的缓存已关闭。单击任何 link 或重新加载页面时,header 会更新以显示正确的信息。问题仅出现在初始 request/response 之后,当登录表单提交和 returns 备用视图时。虽然我们有一个完整的 HTTP request/response 周期,但 Sitecore 似乎不费心去检查任何东西,除了直接受影响的渲染。

我知道我可以通过在登录后返回一个硬 Redirect() 来解决这个问题,但这看起来不优雅并且会产生烦恼,比如丢失 ViewBag 信息。

我真正想要的是一种告诉 Sitecore 的方法,"hey, refresh that other rendering!"

关于这个 'problem' 我什么都找不到 on-line 的事实告诉我,我可能在概念上做错了。

在 MVC 中,您的渲染是按顺序从上到下执行的。因此,如果您的 header 呈现在登录状态呈现之前,它将在用户登录之前完成。

执行此操作的优雅方法可能是执行 post 并通过 JavaScript 更新两个元素。如果您想将 header 逻辑与登录状态逻辑分开,您的登录状态脚本可以允许其他组件注册它们自己的回调。如果您经常做这种事情,您甚至可以构建一个 client-side 消息总线。

你可以看看 Jeremy 的方法: https://jermdavis.wordpress.com/2016/04/04/getting-mvc-components-to-communicate/

我认为,关键在于他通过将结果放入变量中来切换占位符的顺序,然后将它们呈现在您想要的任何位置。

@{
    HtmlString main = Html.Sitecore().Placeholder("MAIN");
    HtmlString head = Html.Sitecore().Placeholder("HEAD");
}
<head>
    @head
</head>

<body>
    @main
</body>

据我所知,有两种方法可以解决这个问题:

表单处理器

您使用@Html.FormHandler 来指定一个Controller 和一个Action 来处理身份验证。 FormHandler 操作将在页面执行的早期执行(请参阅:https://twitter.com/dmo_sc/status/480001473745399809),在呈现任何内容之前,并且您的所有呈现都将具有相同的用户是否登录视图。

Martina 写了一篇关于 Sitecore MVC 和表单的文章:

https://mhwelander.net/2014/05/28/posting-forms-in-sitecore-mvc-part-1-view-renderings/

https://mhwelander.net/2014/05/30/posting-forms-in-sitecore-mvc-part-2-controller-renderings/

Post-重定向-获取

我真的希望 Sitecore MVC 内置此功能,因为它对所有表单提交场景都很有用(栏 AJAX)。这个想法是处理 POST 请求并计算出你想要响应的内容(并将其存储在临时数据中)。您不会返回 ViewResult,而是向同一个 URL 发出重定向,这会强制 GET 到页面(此时所有登录状态对于所有渲染都是相同的),您从 tempdata 中获取结果。此外,P-R-G 防止重新提交 POST 请求。

cprakash 记录了他做 P-R-G 的经历:

https://cprakash.com/2015/01/12/sitecore-mvc-form-post-simplified/

题外话:单页多表单

这不会解决 OP 问题,但在这种情况下值得一看:

http://reinoudvandalen.nl/blog/ultimate-fix-for-multiple-forms-on-one-page-with-sitecore-mvc/