我有一个视图,它为内容页面呈现侧栏。侧栏可以在一个页面上渲染多次。页面布局定义了几个内容部分(或Kooboo术语中的位置(,这些内容部分在实际页面中绑定到特定视图。在每个这样的视图中,我都需要通过重新定义通用侧栏视图来选择性地渲染侧栏。
侧栏的内容存储在Koobos数据库中。为了简单起见,我使用了一种特定的内容类型,它有以下两个字段:
Position
—页面中位置的ID,它与布局中定义的位置的ID相匹配Content
——构成边栏实际内容的HTML片段
侧栏视图的逻辑应该如下:从绑定到当前页面的所有侧栏数据中,选择一个Position
与从外部视图传递的位置匹配的项目作为参数,如果找到,则将其呈现。问题是,我无法找到将参数传递到视图的方法
样本布局片段:
<!-- Header section -->
<section>
<div class="section-content">
@Html.FrontHtml().Position("Header")
@Html.FrontHtml().Position("HeaderSectionContent")
</div>
</section>
<!-- Main section -->
<section class="even">
<div class="section-content">
@Html.FrontHtml().Position("MainSectionContent")
</div>
</section>
绑定到Header
位置的示例视图:
<div class="header-container">
<h1 class="page-title" @ViewHelper.Edit(ViewBag.Solution, "Title")>
@ViewBag.Solution.Title
</h1>
<!-- How to pass "Header" string as an argument into the Controls.Sidebar view? -->
@Html.FrontHtml().RenderView("Controls.Sidebar",ViewData)
<h2 @ViewHelper.Edit(ViewBag.Solution, "Perex")>
@Html.Raw(ViewBag.Solution.Perex)
</h2>
</div>
预期通用侧栏视图Controls.Sidebar
:
@if (ViewBag.Sidebars != null)
{
// How to retrieve an argument and select the matching side bar data?
var sidebar = ViewBag.Sidebars ... ;
if (sidebar != null)
{
<div class="side-bar">
<h3>@item.Title</h3>
@Html.Raw(item.Content)
</div>
}
}
最后,我需要能够多次渲染此视图,并根据数据可用性有条件地渲染几个侧栏。
我正在查看视图编辑器中可用的参数定义,但这似乎提供了对查询字符串参数的访问,这不是我可以(希望(利用的机制。Kooboo文档中缺少与此主题相关的任何信息。
Kooboo中至少有两种方法可以将一些参数从一个视图传递到另一个视图:
首先,您可以将参数值存储在父视图中,如下所示:
Context.Items["ParameterName"]=value;
或者像这样:
var customViewData = new ViewDataDictionary();
customViewData.Add("ParameterName", value);
然后您可以调用子视图的呈现:
@Html.FrontHtml().RenderView("ChildViewName", ViewData) //a default ViewData passed
或分别如下:
@Html.FrontHtml().RenderView("ChildViewName", customViewData)
在ChildViewName的接收端,您只需获取参数值即可:
var value = Context.Items["ParameterName"];
或者因此分别:
var value = ViewData["ParameterName"]; // NB: don't forget to cast parameter to a proper data-type, because ViewData is not processed same smoothly as ViewBag would.
这两种方法都很好。