サイトコアで管理されているサイトで通常の ASP.NET MVC コントローラーを統合する方法の覚書を記載します。といっても通常の ASP.NET MVC プロジェクトテンプレートでプロジェクトを作成したときに Globa.asax から呼び出されるルーティングの設定と同じことを行うだけです。

  • Sitecore 7.2 update 1
  • Visual Studio 2012

1. initilize パイプラインを使用してMVCコントローラーを統合する

サイトコアで管理されているサイトで通常の ASP.NET MVC コントローラーを統合する方法の覚書を記載します。Global.asax 内で ルートを登録している処理と同じことをするだけです。サイトコアと統合するので initilize パイプラインで実装します。

サイトコア用のプロジェクトを右クリック >> 追加 >> 新しい項目の追加 をクリックします。下図のように Sitecore > Pipelines のテンプレートの一覧から Loader Processor を選択してプロセッサーを作成します。今回は名前を RegisterRouteProcessor という名前で作成しました。

App_Config/Include フォルダーで自動的にパッチ用の config ファイルが作成されます。作成されたファイルを 下図のように Customフォルダーに移動し、 InitializeCustomRoutes.config という名前でリネームします。

あとは、次のように InitilizeCustomRoutes.config を編集します。名前空間は適宜読み替えてください。ルートの設定は InitializeRoutes の前に登録するようにします。

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <initialize>
        <processor type="v72u1.Web.Fx.Pipelines.RegisterRouteProcessor,v72u1.Web" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']" />
      </initialize>
    </pipelines>
  </sitecore>
</configuration>

RegisterRouteProcessor パイプラインでは 通常の ASP.NET MVC と同じルートの設定をするだけです。

    public class RegisterRouteProcessor
    {
        public void Process(PipelineArgs args)
        {
            RouteConfig.RegisterRoutes(System.Web.Routing.RouteTable.Routes);
        }
    }

例えば ReouteConfig.cs では次のようなコードでルートの登録を行います。サンプルで作成した RouteConfigでは /cust というパスで通常のASP.NET MVCのルーティングと同じように 独自のASP.NET MVC コントローラーにルーティングされるように登録を行っています。

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(name: "DefaultMVC",
                url: "cust/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            // デフォルトのルート設定はコメントアウト
            // デフォルトのルートを使用したい場合は Sitecore.Mvc.config の 
            //  Mvc.IllegalRoutes 変更する
            //routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //routes.MapRoute(
            //    name: "Default",
            //    url: "{controller}/{action}/{id}",
            //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            //);
        }
    }

準備は完了です。例えば 次のような AccountController というサンプルの MVC コントローラーを作成して動作確認を行ってみます。

namespace v72u1.Web.Controllers
{
    public class AccountController : Controller
    {
        //
        // GET: /Account/
        public ViewResult Index()
        {
            return View();
        }

        public JsonResult GetUserInfo()
        {
            // Context から値を取得できる
            var account = new AccountInfo
            {
                UserName = Sitecore.Context.User.Name
            };
            return Json(account, JsonRequestBehavior.AllowGet);
        }
    }
}

プロジェクトを Sitecore にデプロイして例えば /cust/Account/GetUserInfo にアクセスするとファイルをJson形式で応答が返されることを確認できます。

2.まとめ

簡単ですが説明は以上です。Sitecore 7.2 では ASP.NET MVC が統合されたWeb.config になっていますので、ルーティングの登録さえしてあげれば簡単に 通常の ASP.NET MVC のプログラムを実装することができるようになっています。