我尝试在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标记块之间切换,具体取决于位于这些块之外的视图渲染的设置。也许有更好的方法来做到这一点,但我不确定。我看到的是视图渲染代码在布局渲染后被编译,因此代码实际上永远不会被执行。
答案 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,它有一个关于渲染相互依赖性的概念。