首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MVC视图之间传递参数以匹配模型中可用的数据源中的项

在MVC视图之间传递参数以匹配模型中可用的数据源中的项
EN

Stack Overflow用户
提问于 2013-05-08 21:53:06
回答 1查看 430关注 0票数 0

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

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

  • Position -页面中位置的ID,它与布局中定义的位置的ID匹配。
  • Content -构成侧栏实际内容的HTML片段

侧栏视图的逻辑应该如下:从绑定到当前页面的所有侧条形数据中,选择一个带有Position的单个条目,将其作为参数从外部视图传递给一个位置,如果找到,则呈现它。问题是,我想不出把参数传递到视图中的方法

样本布局片段:

代码语言:javascript
复制
<!-- 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位置的示例视图:

代码语言:javascript
复制
<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

代码语言:javascript
复制
@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文档缺乏与此主题相关的任何信息。

EN

回答 1

Stack Overflow用户

发布于 2013-11-21 14:52:32

在Kooboo中,至少有两种方法可以将一些参数从一个视图传递到另一个视图:

首先,可以将参数值存储在父视图中,如下所示:

代码语言:javascript
复制
    Context.Items["ParameterName"]=value;

或者像这样:

代码语言:javascript
复制
    var customViewData = new ViewDataDictionary();
    customViewData.Add("ParameterName", value);

然后,您可以调用子视图的呈现:

代码语言:javascript
复制
    @Html.FrontHtml().RenderView("ChildViewName", ViewData) //a default ViewData passed

或分别如下:

代码语言:javascript
复制
    @Html.FrontHtml().RenderView("ChildViewName", customViewData)

在ChildViewName的接收端,您只需获取参数值,因此:

代码语言:javascript
复制
    var value = Context.Items["ParameterName"];

或因此分别:

代码语言:javascript
复制
    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. 

这两种方法都能很好地达到这个目的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16450841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档