将数据从Sitecore MVC视图渲染传递到布局渲染

时间:2016-02-04 10:44:27

标签: sitecore sitecore-mvc

我尝试在Sitecore MVC视图渲染中使用ViewBag将一些数据传递给相关的布局渲染,但它没有工作。在标准的ASP.NET MVC中你可以做到这一点,但也可以在Sitecore中做同样的事情吗?如果没有,那么你如何传递数据?

修改

澄清我的问题,这是我想要做的: 我有这样的布局渲染:

@using Sitecore.Mvc
@using Sitecore.Mvc.Analytics.Extensions
@using Sitecore.Mvc.Presentation
@model RenderingModel
@{
Layout = null;
}
<!doctype html>
<html>
<head>....</head>
<body>
@if (ViewBag.ShowNewsletterPopup == "display")
{
    <!-- render proper html markup to show newsletter popup -->
} 
else {
  <!-- render regular html markup --> 
}
<!-- some html markup here -->
@Html.Sitecore().Placeholder("widget")
<!-- some more html markup -->

然后,在内容占位符内部进行视图渲染,其代码如下:

@using Sitecore.Mvc
@using Sitecore.Mvc.Presentation
@using Sitecore.Data.Items

@model RenderingModel
@{
   ViewBag.ShowNewsletterPopup = Model.Rendering.Parameters["ShowNewsletterPopup"];

所以,我想要实现的是在两个html标记块之间切换,具体取决于位于这些块之外的视图渲染的设置。也许有更好的方法来做到这一点,但我不确定。我看到的是视图渲染代码在布局渲染后被编译,因此代码实际上永远不会被执行。

1 个答案:

答案 0 :(得分:8)

我可以确认Sitecore MVC的当前行为不起作用。在以下场景MVC布局中:

@using Sitecore.Mvc
@{
    Layout = null;
    ViewBag.Message = "ViewBagData";
}
<html>
<body>
Message: @Html.Partial("View Rendering") <br>
Message: @Html.Sitecore().ViewRendering("View Rendering")
</body>
</html>

查看渲染:

@ViewBag.Mything

您会看到以下输出:

Message: ViewBagData
Message:

潜在的问题是ViewRendering类型会旋转一个新的HtmlHelper。虽然ViewData被传递给了这个,但是对ViewData的字典支持的实际写入是延迟的(这是MVC的事情)。

我认为ViewBag数据的行为与@Html.Partial()的行为相同。

有一个相关的topic around TempData on the Sitecore community user voice

你可以使用类似的东西(虽然它感觉像是一种气味):

Sitecore.Context.Items["Message"]

也许看看this video,它有一个关于渲染相互依赖性的概念。