3

MVC Razorビューをクライアント側レンダリング用のjavascriptテンプレートとして再利用する方法を探していましたが、razorビューをjavascript関数に解析するこのライブラリ(Razorクライアントテンプレート)を見つけました。

Razorエンジンバージョン2ではボールを再生しません。少し掘り下げてみると、これはRazorエンジンの構文ツリーが見直されたためです。物事を変更しようとして、RazorViewEngineパーサーからいくつかの奇妙な結果を見つけました。

私は次のように非常に単純なビューを持っています:

@model Justis4.Models.EntityModel
<div>
    @Model.PropertyOne
    @Model.PropertyTwo
</div>

かみそりのクライアントテンプレートライブラリは、次のように始まります。

var host = new RazorEngineHost(newCSharpRazorCodeLanguage());
var engine = new RazorTemplateEngine(host);
var parserResults = engine.ParseTemplate(razorTemplate);  //from string reader
var doc = parserResults.Document;

次に、結果の構文ツリーをjavascript関数に解析し始めます。

構文ツリーをデバッグすると、奇妙なことがいくつか見られます。私が理解しているように、Razorエンジンは、ビューをさまざまなタイプの「ブロック」と「スパン」に分割します。ただし、図のように、上部のモデル宣言はコードではなくマークアップとして解析されています。同様の奇妙な点があり、その結果、javascriptへの残りの解析は失敗します。

ここに画像の説明を入力してください

4

1 に答える 1

3

@model標準のかみそりパーサーはキーワードを認識しません。@modelキーワードは、アセンブリ内のMvcCSharpRazorCodeParserクラスから取得System.Web.Mvcます。

このための主な機能は、SetModelTypeCodeGeneratorから提供されます。このクラスは、コアのかみそりエンジンクラスであるSetBaseTypeCodeGeneratorを使用して、かみそりビューの基本タイプをデフォルトからに変更しWebViewPageますWebViewPage<Model>

ソリューション

@inherits代わりにキーワードを使用してください@inherits WebViewPage<EntityModel>

または、への参照を追加しSystem.Web.Mvcてカスタム言語を使用し、コードパーサーをに変更しますMvcCSharpRazorCodeParserRazorEngine.DefaultBaseClassプロパティを、使用する予定の基本クラスの非汎用バージョンに設定する必要があります。たとえば、WebViewPage<T>を設定しengine.DefaultBaseClass = "System.Web.Mvc.WebViewPage"ます。

class MvcCSharpRazorCodeLanguage : CSharpRazorCodeLanguage
{
    public override ParserBase CreateCodeParser()
    {
        return new MvcCSharpRazorCodeParser();
    }
}
于 2013-01-08T20:42:30.470 に答える