4

Microsoft には、新しい Web サイト編集ツールである WebMatrix があります。WebMatrix は、Razor がビュー エンジンである新しい Web ページ エンジンを使用します。Razor は、MVC3 の新しいビュー エンジンでもあります。Web ページで別のビュー エンジンを登録して使用できるかどうかを調べようとしています (MVC でできるように)。

Web ページでビュー エンジンを追加または置換できるかどうかを知っている人はいますか? もしそうなら、誰かがこれを文書化していますか? 例?

4

2 に答える 2

2

私はこれを少し後で自分で試してみたいと思っていますが、今のところ私は私の現在の考えを共有します

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か何かを登録しようと思います。

于 2011-02-21T13:29:04.037 に答える
0

MVCと同じ方法でWebページにビューエンジンを「登録」することはできません。ファイルタイプを組み合わせるだけです。Webページサイトに.aspxファイルを追加するのを止めるものは何もありません。Webページは、VSのWebサイトプロジェクトに非常によく似ています。

于 2011-02-17T20:47:34.057 に答える