2016-04-16 9 views
1

ページが追加されたときに、ContentArea内でレンダリングするはずのページがあります。これは完全に動作しますが、今は2つの異なるページに2つの異なるContentAreaがあり、それぞれの親ページで異なる子ページをレンダリングする必要があります。EpiServerで異なる部分テンプレートをレンダリングする

私はContentAreas区別する部分をレンダリングするとき、私はいくつかの方法でタグを使用することができることを得る

:私は、(私の部分図である)私のSomePage.cshtmlで、その後ん

@Html.PropertyFor(m => m.MyBlockProperty, new { Tag = RenderingTags.Sidebar }) 
@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar }) 

しかし、私はどのタグが頼まれたのか知っているので、ここに何かを得るか?あるいは、SidebarSomePage.cshtmlのようないくつかの命名規則があり、私は複数の部分テンプレートを定義できますか?これを処理するコントローラを作成する必要がありますか?ページに応じてHTMLを少し変更したいのですが...

答えて

1

ビュー(またはコントローラ)のビューデータディクショナリからこのタグにアクセスできることは間違いありません:

@ViewData["Tag"] 

また、ビュー

@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar, RenderThisPartialDifferently = true, ShowHeading = false }) 

に他の設定をパスし、それらにアクセスすることができます。

@ViewData["RenderThisPartialDifferently"] 
@ViewData["ShowHeading "] 

そして、その間にコントローラを置いて完全に異なるビューをレンダリングするオプションがあります。

タグビューの命名規則もあります。私が確かに知っていることは、/ shared/displaytemplatesのタグと同じ名前のビューを置くことができることです。しかし、それは今あなたが求めていることではありません。

+0

を私は何を書くべき部分的なSidebarSomePage.cshtmlタグにアクセスするには? – theva

+0

ありがとう!これは完璧に機能しました!私はちょっと混乱した@notationを使っています。 – theva

+0

私はちょうどあなたの質問と同じ構文を使用していました。 Razor構文を反映するためにあなたの質問を変更してください:) –

1

PartialContentController<T>を作成してから、TemplateDescriptorAttributeを使用して、使用したくないタグを指定します。 Johanが説明したようにPropertyForを使用します。

EPiServer documentation

からは、コンテンツのインスタンスをレンダリングするために選択したテンプレートは、このようなチャンネルやタグ付けなどの特定のコンテキストに依存します。テンプレートが自動的に登録されるためには、EPiServer.Web.IRenderTemplateを実装しなければなりません(ここでTはどのモデルをレンダリングできるかを示します)。 PageBase、ContentControlBase、BlockControlBase、PageController、PartialContentControllerまたはBlockControllerのようなテンプレートの基本クラスを使用する場合、基本クラスによって行われるため、インターフェイスを明示的に実装する必要はありません。さらに、TemplateDescriptorAttributeを使用して、タグや継承などのテンプレートの詳細や後でそのトピックの詳細を指定できます。

0

また、すべての回答に加えて、テンプレート登録者を使用して、特定のタグの追加テンプレートを登録することができます。

[ServiceConfiguration(typeof(IViewTemplateModelRegistrator))] 
public class TemplateCoordinator : IViewTemplateModelRegistrator 
{ 

    public void Register(TemplateModelCollection viewTemplateModelRegistrator) 
    { 
     viewTemplateModelRegistrator.Add(typeof(MyBlock), new TemplateModel 
     { 
      Tags = new[] { RenderingTags.Sidebar }, 
      AvailableWithoutTag = false, 
      Path = BlockPath("Some-Other-Template.cshtml") 
     }); 
    } 
} 

これはHtml.PropertyFor(...., new { tag = RenderingTags.Sidebar }))ファイルSome-Other-Template.cshtml経由でインスタンスのブロックがレンダリングされる場合は、「内部」RenderingTags.Sidebarコンテキストが(使用されることを確認します。

AlloyTechがサンプルコードがあります。

関連する問題