0

コンテンツ ページのサイド バーをレンダリングするビューがあります。サイド バーは、1 つのページに複数回レンダリングできます。ページのレイアウトは、実際のページでは特定のビューにバインドされるいくつかのコンテンツ セクション ( Kooboo の用語では位置) を定義します。このような各ビューでは、汎用のサイド バー ビューを再レンダリングして、オプションでサイド バーをレンダリングする必要があります。

サイドバーのコンテンツは Kooboos データベースに保存されます。簡単にするために、次の 2 つのフィールドを持つ特定のコンテンツ タイプを使用しています。

  • 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 であるビューから別のビューにパラメータを渡すには、少なくとも 2 つの方法があります。

まず、次のようにパラメーター値を親ビューに保存できます。

    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 に答える