kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

カテゴリーアーカイブ: Razor

WebMatrix で管理ページをカスタムする方法


うぇぶまとりっくすたん側で書くネタ探しに挑戦し始めたのですが、全然WebMatrix単体で完結せず、しかもVisual Studio標準機能では完結しなかったという訳で、VS拡張を一個作る羽目に…という事でうぇぶまとりっくすたんのスコープ(WebMatrixユーザー、開発初心者向け)から落ちたという形で、こっちのブログに書く事にしました。

今回カスタムするのはWebMatrixでテンプレートからサイトを作成、実行し _admin へ遷移してログインをすると表示されるページ、デフォルトでは Library Package Manager として NuGetパッケージの参照およびインストール機能が入ってる所です。

ここに Library Package Manager から Publish Settings Generator をインストールすると展開に使用する設定の生成に関するページが表示されるという事で、ここにカスタムをNuGetパッケージから入れる事ができるというのは見た目から解ってまして、それを実装に落としていく上で必要になった事柄を説明していきたいと思います。

まず、この管理画面を提供している物、こいつがなんなのかですが、System.Web.Pages.Administration 配下でこの管理画面が提供されており、 SiteAdmin クラスが今回の主なお話相手になります。

んで、管理ページの一覧に出す方法ですが、以下のコードになります。クラスライブラリプロジェクトで以下を実装してください。

using System.Web;
using System.Web.WebPages;
using System.Web.WebPages.Administration;
[assembly: PreApplicationStartMethod(
        typeof(CustomAdministrationHelper.PreApplicationStartCode),
        “Start”)]

namespace CustomAdministrationHelper
{
    public static class PreApplicationStartCode
    {
        public static void Start()
        {
            SiteAdmin.Register(“~/customAdmin/”, “test custom admin page”, “custom admin page”);
            var appPart = new ApplicationPart(
                    typeof(PreApplicationStartCode).Assembly,
                    SiteAdmin.GetVirtualPath(“~/customAdmin/”));
            ApplicationPart.Register(appPart);
        }
    }
}

単純には PreApplicationStartMethodアセンブリ属性でマークされた public static void Start メソッドで SiteAdmin オブジェクトに項目を登録します。そしてApplicationPartオブジェクトに該当アセンブリを virtual path prefix を指定して追加します。

これの最初の SiteAdmin.Register を指定した時点で、WebMatrixの管理ページには以下のように項目が表示されます。アプリケーションの bin 配下にコンパイルされたアセンブリを配置してください。

image

続く ApplicationPart の追加によって、追加したアセンブリ内で定義されるページの表示へのURL解決が設定されます。

要するに該当アセンブリに cshtml があり、それがコンパイルされた結果があり、URLの解決がうまくいけばページが表示されるわけです。

ここで第一の問題 cshtml のコンパイルされた結果を得る方法とは?

これを解決するには cshtml を C# コードに変換し、C#コンパイラにアセンブリにクラスを含めてもらうという事です。

ASP.NET MVC 3 Razor の場合にはコードギャラリーの Razor Single File Generator for MVC を利用する事で解決します。

そうでないノーマルな cshtml の場合にはこの元となった Razor Single File Generator があるのですが、このジェネレータは残念な事に @Helper な cshtml にしか対応していません。

という事でこの Razor Single File Generator を改造し、 cshtml の一般ページ向けのジェネレータを作成しました、現物は私の SkyDrive のpublicに、説明ページはこちらにありますのでインストールしてください。

cshtml ページを作成し、カスタムツールに RazorPagePreprocessor を指定するとC#なコードが得られます。

次に、URLの解決です。cshtmlを元に生成されるクラスに System.Web.PageVirtualPathAttribute による属性修飾が必要です。

この属性修飾ですが、ジェネレータで一括対応する事もできたのですが、本来表示したくないページをURLにマップしてしまう可能性も無いわけではないので( @inherits の継承元ページにURLをマップしてしまうとまずいです)、コード生成を partial で行う事で、「別の partial パートで属性修飾すればいいじゃない」という逃げを打っています。

なので partial part を付与します。

namespace CustomAdministrationHelper
{
    [System.Web.WebPages.PageVirtualPath(“~/Default.cshtml”)]
    partial class _Page_Default_cshtml
    {
    }
}

これにより、アセンブリにマップされた ~/customAdmin/ の配下の ~/Default.cshtml が _Page_Default_cshtml クラスであるという属性修飾が行われます。

ここで、簡単な以下の cshtml を Default.cshtml としてみました。

<html>
<head><title>てすとです</title>
</head>
<body>ぼでぃー</body>
</html>

表示させた結果が以下。

image

ちゃんと出ましたね。

という訳で、 WebMatrix の管理ページをカスタムするサンプルでした。

サンプルプロジェクトは SkyDrive にあげてあります のでそちらもどうぞ。

広告