2011-01-30 9 views
27

による部分の内側に、私は部分的な「サイドバーには、」マスターページ(レイアウト)に追加したし、この部分の内側に私が使用しています:使用するビューのいずれかにRenderSection()マスターページ

@RenderSection("SearchList", required: false) 

をマスターページ、私がやっている:

@section SearchList { 
    // bunch of html 
} 

を、私にエラーを与えている:

The file "~/Views/Shared/_SideBar.cshtml" cannot be requested directly because it calls the "IsSectionDefined" method.

ここで間違っているのですか?

答えて

21

現在、Razorではサポートしていません。セクションは、ビューページとその即時レイアウトページの間でのみ機能します。

+0

任意の回避策のように見えるのでしょうか?私はレイアウト - >ページ - >パーシャルを持っています。スクリプト/レイアウトが参照され、その部分があるときに頭に読み込まれる必要があります。これを行うための任意の非愚かな方法?とにかくこの制限のポイントは何ですか? – Shimmy

+0

@ Shimmyあなたはレイアウトデータによって参照されるべきものを指定するViewDataにある種のデータ構造を入れてみることができます。 – marcind

+0

ありがとうございます。ちょうどいいソリューションのように見える[カセット](http://getcassette.net/)について読んでいます。ありがとうございました。 – Shimmy

13

レイアウトビューを作成するときに、一部の部分を部分ビューに別々に配置したい場合があります。

これらの部分表示のいずれかのマークアップに配置する必要があるセクションをレンダリングする必要が生じることもあります。しかし、部分ビューはRenderSectionロジックをサポートしていないので、これを回避する必要があります。

部分ビューのモデルとしてレイアウトページのRenderSection結果を渡すことで、部分的なビューでセクションをレンダリングできます。この行を_Layout.cshtmlに入れることでこれを行うことができます。 _Layout.cshtml

@{ Html.RenderPartial("_YourPartial", RenderSection("ContextMenu", false));} 

はその後_YourPartial.cshtmlに、あなたは_layoutビューのHtml.RenderPartial呼び出しでモデルとして渡さセクションをレンダリングすることができます。セクションが必要でない場合に備えて、モデルがnullであるかどうかをチェックします。

_YourPartial.cshtml

@model HelperResult 
@if (Model != null) 
{ 
    @Model 
} 
+1

何ですか?面白いですが、ちょっと説明する必要があります。これはちょっとしたハックだからです。 –

+1

要求通りに更新...これは現在より明確ですか? – Bosken85

+0

はい。ありがとう。まだ少しハッキーですが、私が推測する仕事はあります。 upvoted。 –

4

かみそりのヘルパーでこれを解決することが可能です。ちょっとエレガントでハッキーですが、それは私の仕事でした。あなたはヘルパーを定義する親ビューでそう

:あなたは、部分的にレンダリングするとき

@helper HtmlYouWantRenderedInAPartialView() 
{ 
    <blink>Attention!</blink> 
} 

はその後、あなたはそれにこのヘルパーを渡し

@Html.Partial("somePartial", new ViewDataDictionary { { "OptionalSection1", (Func<HelperResult>)(HtmlYouWantRenderedInAPartialView) } }) 

そして、部分図の内側に、あなたは次のようにこのヘルパーを呼び出しますしたがって

<div>@ViewData.RenderHelper("OptionalSection1")</div> 

最後に、この「拡張」メソッドを使用して、「呼び出し元」ファイルを簡素化する必要がありますRT

public static HelperResult RenderHelper(this ViewDataDictionary<dynamic> viewDataDictionary, string helperName) 
{ 
    Func<HelperResult> helper = viewDataDictionary[helperName] as Func<HelperResult>; 
    if (helper != null) 
    { 
     return helper(); 
    } 

    return null; 
} 

だから、全体のポイントは、このヘルパーのデリゲートを渡すことで、子ビューがそれを呼び出した後、ときにそれらを配置したい場所、内容がレンダリングされます。

子ビューの最終結果は、この

<div><blink>Attention!</blink></div>