0

我有一个为内容页面呈现侧边栏的视图。侧边栏可以在单个页面上多次呈现。页面布局定义了几个内容部分(或Kooboo 术语中的位置),在实际页面中,这些部分绑定到特定视图。在每个这样的视图中,我需要通过重新渲染通用侧边栏视图来选择性地渲染侧边栏。

侧边栏的内容存储在 Kooboos 数据库中。我正在使用一个特定的内容类型,为了简单起见,它有以下两个字段:

  • 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 文档缺少与此主题相关的任何信息。

4

1 回答 1

3

在 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. 

两种方式都可以很好地达到这个目的。

于 2013-11-21T14:52:32.420 回答