7

次のような Page.cshtml があります (これは機能しません)。

@{
    Layout = "../Shared/Layouts/_Layout.cshtml";
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>);
}

<h2>@ViewBag.Title</h2>

content here

@if (mycollection != null && mycollection.Count() > 0)
{    
    @section ContentRight
    {    
        <h2>
            Stuff
        </h2>
        <ul class="stuff">
            @foreach (MyCollectionType item in mycollection )
            {
                <li class="stuff-item">@item.Name</li>
            }
        </ul>
    }
}

私が言ったように、これはうまくいきません。コレクションに何もない場合は、セクションを定義したくありません。このようなものを機能させる方法はありますか?そうでない場合、他にどのような選択肢がありますか? 私はこの Razor ViewEngine を初めて使用します。

編集

私のレイアウトには次のものがあります:

@if(IsSectionDefined("ContentRight")) 
{
    <div class="right">
        RenderSection("ContentRight")
    </div>
}

私が望まないのは、セクションが空のときに出力する div です。

4

5 に答える 5

3

必要な方法で機能させるために、少しハックなことをしてしまいました。

私のページには次のものがあります:

@{
    Layout = "../Shared/Layouts/_Layout.cshtml";
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>);
    ViewBag.ShowContentRight = mycollection != null && mycollection.Count() > 0;
}

それから私のレイアウトで私は持っています:

@if(IsSectionDefined("ContentRight") && (ViewBag.ShowContentRight == null ||ViewBag.ShowContentRight == true)) 
{
    <div class="right">
        RenderSection("ContentRight")
    </div>
}
else if(IsSectionDefined("ContentRight"))
{
    RenderSection("ContentRight")
}

セクションが定義されている場合はレンダリングする必要がありますが、コンテンツがない場合は<div>sは必要ありません

もっと良い方法があれば知りたいです。

于 2011-02-08T13:31:24.350 に答える
2

レンダラーは、メソッドがレイアウト ファイルでいつか呼び出されることを期待しています。レンダラーを偽装して、「グローバル」条件を使用できます (ログインを考えてください)。

@{
    ViewBag.content = RenderBody();
}
@if (Request.IsAuthenticated) {
        @ViewBag.content;
} 
else {
        @Html.Partial("_LoginPartial")
}
于 2012-10-02T02:32:26.487 に答える
0

ビューの基本クラスで次のメソッドを使用します (この優れたブログ投稿http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx/から) ):

public HelperResult RenderSection(string name, Func<dynamic, HelperResult> defaultContents)
{
    if (IsSectionDefined(name))
    {
        return RenderSection(name);
    }
    return defaultContents(null);
}

ビューの基本クラスがない場合は、ビューにあらゆる種類の小さな追加機能を追加できるため、ビューの基本クラスをお勧めします。次のシグネチャを持つクラスを作成するだけpublic abstract class MyViewPage<T> : WebViewPage<T>ですweb.config:

<system.web.webPages.razor>
  <pages pageBaseType="MyViewPage">
    ...
  </pages>
</system.web.webPages.razor>
于 2014-12-18T22:02:20.190 に答える
-1

セクション全体をifステートメントでラップできますIsSectionDefined

Layout.cshtml:

@if (IsSectionDefined("ContentRight"))
{
    <div>
    @RenderSection(name: "ContentRight", required: false)
    </div>
}

あなたの cshtml ページ:

@section ContentRight
{    
    @if (mycollection != null && mycollection.Count() > 0)
    {   
    <h2>
        Stuff
    </h2>
    <ul class="stuff">
        @foreach (MyCollectionType item in mycollection )
        {
            <li class="stuff-item">@item.Name</li>
        }
    </ul>
    }
}
于 2011-02-04T21:54:24.540 に答える