Sitecore MVC の Controller レンダリング は Viewレンダリングと同じようにcshtmlで定義されたビューページの上に 静的もしくは動的にバインド可能なコンポーネントの一つです。Viewレンダリングとは異なり、 Controller クラスを作成してレンダリングを行うプレゼンテーションコンポーネントになります。

Controller レンダリングを使用すると 動的に出力に使用するモデルやビューを動的に変更することができるだけでなく、RenderAction メソッド等を使用してレンダリングを行っていた既存のASP.NET MVC4 部分ページをSitecoreの Controller レンダリングとして使用できるようになります。アイテム化することで静的バインド以外に動的なバインドを行えるようになります。

検証環境

  • Sitecore 7.1 がローカルにインストールされた環境
  • Visual Studio 2012 Ultimate
  • Sitecore Rocks 1.1.0

今回は非常にシンプルな Controllerレンダリングを作成してみます。コントローラーレンダリングを作成するプロジェクトは[Sitecore Rocks]ASP.NET MVC 4 Web アプリケーションプロジェクトをセットアップするなどを参照してセットアップ済みであることを前提とします。

1. Controller レンダリングの作成

ASP.NET MVC4 プロジェクトテンプレートを作成すると既定で作成される Controllersフォルダーを右クリック→追加→コントローラーをクリックします。

コントローラーの追加ダイアログが表示されます。 今回は 下図のように SimpleController という名前で コントローラーを作成してみます。追加ボタンをクリックします。

作成した SimpleController.cs を例えば次のように編集します。Sitecoreの機能を使用しない場合は Sitecore.Mvc.Presentation などの名前空間の参照は不要です。 PageContext は サイトコアのクラスなので今回は using に指定しています。Sitecoreの機能を使用しない場合は、通常のASP.NET MVC4 の機能のみを使用するコントローラーとして実装することもできます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Sitecore.Mvc;
using Sitecore.Mvc.Presentation;

namespace SC.Mvc.Controllers
{
    public class SimpleController : Controller
    {
        public ViewResult Hello()
        {
            PageContext ctxt = PageContext.CurrentOrNull;
            MvcHtmlString s = null;
            if (ctxt != null && ctxt.Item != null)
            {
                s = new MvcHtmlString(ctxt.Item.Paths.Path);
            }else{
                s = MvcHtmlString.Empty;
            }
            return View(s);
        }
    }
}

コントローラークラスを作成したのでHelloアクション用の MVC 4 部分ページ(cshtml) を作成します。下図のように Simple というフォルダーを Viewsフォルダ配下に作成します。Simpleフォルダーを右クリック→追加→新しい項目 をクリックします。

新しい項目の追加 ダイアログが表示されるので、 MVC 4 のカテゴリから MVC 4 部分ページ(Razor) テンプレートを選択してファイルを作成します。今回は Helloアクションに対応するメソッドを作成するので Hello.cshtml という名前で部分ページを作成しました。

作成して Hello.cshtml を編集します。部分ページの実装は今回はあまり重要ではないので、単純にモデルクラスから渡された MvcHtmlString の文字列を出力するというシンプルなマークアップにしました。

@model MvcHtmlString

<div>
    @Model.ToHtmlString()
</div>

コントローラーとパーシャルページの準備ができましたので、Controller Rendering 定義アイテムを作成します。 Sitecore Explorer のRenderingsアイテムを右クリック→Add → Controller rendering をクリックします。

Add New Item ダイアログが表示されます。 今回は SimpleControllerRendering という名前で Controller rendering の定義アイテムを作成します。 OK ボタンをクリックします。

SimpleControllerRendering アイテムを編集します。 Controller に Simple (Controller は不要です)。 Controller Action に実行する アクションを指定します。

フィールドを編集したら忘れずに保存(Ctrl-S)してください。

2.動作確認

Homeアイテムのレイアウト詳細を編集して、 作成した SimpleControllerRendering アイテムを動的にバインドしてみます。MainViewというレイアウトは ビューページを使用するレイアウトで content とうプレースホルダーが配置されていることを前提とします。Homeアイテムをクリックして Design Layout もしくは Ctrl + U を入力して レイアウト詳細の画面を表示します。下図左上の Add Rendering をクリックして作成した SimpleControllerRendering 定義アイテムを動的バインドを行うレンダリング一覧に追加します。 一覧に追加した SimpleControllerRendering  を選択してプロパティ画面の PlaceHolderKey プロパティに 配置するプレースホルダーの名前 (ここでは content ) を設定します。レイアウト詳細の編集が終わったら Ctrl+S で変更を保存します。

準備は完了となります。最後に、 ASP.NET MVC 4 プロジェクトをビルドしエラーが発生しないことを確認したら SitecoreのWebsite フォルダーに プロジェクトを発行(publish)してファイルデプロイします。

ページエディターで Home アイテムを表示すると 動的にバインドした Simple.cshtml 部分ビューが出力されていることを確認できます。出力内容は SimpleControllerのHelloアクション内で生成した文字列になります。

3.まとめ

説明は以上となります。 Viewレンダリングは 部分ビュー(cshtml) のみを定義して実装できるのに対して、 Controller レンダリングを使用すると実装するコード量が多くなる代わりに コントローラークラスを使用してモデルの作成やビューの選択などを制御できるようになります。

今回の例は非常に簡単なものです。カスタムモデルを使用する高度なコントローラーレンダリングの使い方は[Sitecore MVC]カスタムモデルを使用するその2を参照してください。