各アイテムのスタンダードフィールドには次のようなフィールドがあります。

  • __Controller
  • __Controller Action

多くの場合、サイトコアでは コンテンツアイテムのページがリクエストされた場合 、レイアウト詳細の設定に従て html ページを出力しますが、本フィールドに独自のコントローラーとアクションを指定することで、 ASP.NET MVC のコントローラーで行えるような html以外の形式の出力が行えるようになります。

今回は カスタムのコントローラクラスを作成して Json形式のレスポンスを返すサンプルを記載してみます。

検証環境は次の通りです。

  • Sitecore CMS 7.2 Update -1
  • Visual Studio 2012 上で作成

1. カスタムコントローラークラスの作成

ASP.NET MVC と同じように カスタムコントローラーを作成します。ソースを見ていただくとわかりますが非常にシンプルなコントローラクラスです。Testアクションで Json形式の出力を行うようにしています。

using Sitecore;
using Sitecore.Configuration;
using Sitecore.Mvc.Presentation;
using Sitecore.Mvc.Extensions;
using Sitecore.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using v72u1.Web.Models;
using Sitecore.StringExtensions;


namespace v72u1.Web.Controllers
{
    public class CustomController : Controller
    {
        public JsonResult Test()
        {
            var p =  new Product
            {
                Name = "Hello",
                Price = 1000.0m
            };

            return Json(p, JsonRequestBehavior.AllowGet);
        }

    }
}

プログラムをビルドして SitecoreのWebsiteのbinフォルダーに配置します。

2. 実際に使ってみる

今回は ProductJson というアイテムのフィールドにコントローラーとアクションの設定をしました(下図参照)。

コントローラー(__Controller)フィールドにコントローラークラスのシグネチャ(<完全修飾名付きクラス名>, <アセンブリ名> を設定し、コントローラーアクションにアクションメソッドを指定しています。

実際にパブリッシュを行ってProductJsonのページを表示してみます。すると、下図のようにJson形式でレスポンスを取得できたことが確認できます。

独自のコントローラーを使用することで Sitecore MVC で使用されるデフォルトの コントローラーを変更せずに、特定のアイテムにだけ独自のコントローラーを使用することができるようになります。

3.コントローラ定義アイテムを使用する場合

layout/Controllers 配下にコントローラー定義アイテムを作成することができます。ここで下図のようにコントローラ定義アイテムを作成し Controller Name にコントローラーのシグネチャ、 Action Name に既定の アクションメソッド名を指定しておくことができます。

コントローラー定義アイテムを事前に定義しておくことで、下図のように __Controller フィールドに コントローラー定義アイテムの名前を設定するだけでサイトコアは自動的にコントローラ定義アイテムで設定されているコントローラーと既定のアクションメソッドを呼び出してくれます。 __Controller Action を設定することで コントローラー定義アイテムの Action Name で設定されている 既定のアクションメソッドを上書きして別のアクションメソッドを呼び出すように設定できます。

4. まとめ

説明は以上です。スタンダードフィールドの __Controller と __Controller Action を使用することで既定のSitecoreController 以外のMVCコントローラーを使用してレイアウト詳細に依存しないレスポンスを生成することができるようになります。とはいっても、HTMLマークアップ以外の形式を出力するといった特別なことをする場合を除きこのようなページリクエストを処理するコントローラーレベル での変更をすることはあまりないとは少ないでしょう。実際には、HTMLマークアップ以外の形式のレスポンスを行いたい場合は、ASP.NET MVC(Sitecore MVC) ではなく単純にASP.NET Webフォームのレイアウトを使用することもできますし、そもそもコンテンツアイテムとは独立し た 単独の ASPXやMVCのページやWebサービスの場合ASMXとして実装するといったいくつかの選択肢があります。