私はこれを少し後で自分で試してみたいと思っていますが、今のところ私は私の現在の考えを共有します:
Webページでは、RazorはBuildProviderを.cshtmlおよび.vbhtmlのASP.NETビルドパイプに登録することで機能します。
次に、WebPagesは、.cshtml.vbhtml拡張子をハンドラーに登録します。
webPagesページが要求されると、System.Web.WebPages.WebPageHttpHandlerはビルドパイプにパスを渡します。ビルドパイプでは、拡張機能が登録済みのRazorプロバイダーと照合され、ページがレンダリングされ、WebPageオブジェクトが返されます。このハンドラーはIISに渡されます。提供されます。
リフレクションツールを使用すると、これらすべてが表示されます。これらは両方とも、対応するアセンブリのPreApplicationStartCode.Start()で実現されます。
ビルドプロバイダーをフックするRazor:
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
BuildProvider.RegisterBuildProvider(".cshtml", typeof(RazorBuildProvider));
BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
}
}
WebPageHandlerをフックするWebPages
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
WebPageHttpHandler.RegisterExtension("cshtml");
WebPageHttpHandler.RegisterExtension("vbhtml");
PageParser.EnableLongStringsAsResources = false;
DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));
ScopeStorage.CurrentProvider = new AspNetRequestScopeStorageProvider();
}
}
オーバーライドするには、別のBuildProviderを作成してASP.NETパイプに登録し、ページをレンダリングする必要があります。System.Web.WebPagesは、WebPageHttpHandler.RegisterExtension()メソッドを提供します。このメソッドは、理論的には、Razorの代わりにWebPageリクエストを取得する別のBuildProviderをフックできます。
いくつかのブログではRegisterExtensionメソッドについて言及していますが、100%機能しないことを示すオープンコネクトのバグレポートもあります。すべてをオーバーライドして、buildproviderをパイプにフックする方が適切な場合があります(メソッドを使用しないでください)。
Web.configは、buildProvidersを登録するための構造を提供しているので、それを試してみます。
<buildProviders>
<add extension=".cshtml" type="CustomStuff.CustomBuildProvider"/>
</buildProviders>
課題は、そこにあるほとんどのビューエンジンがViewEngines.Register()を使用していることです。これは、webPagesにはないように見える概念です。したがって、これらのビューエンジンをBuildProviderでラップするか、IViewEngineを正常に呼び出すことができるBuildProviderを作成する必要があります。
繰り返しますが、私の考えを共有するだけです。時間があれば、後でSparkか何かを登録しようと思います。