RazorTemplateEngine解析器生成不寻常的语法树

时间:2013-01-08 19:45:51

标签: c# razor asp.net-mvc-4 razor-2

我一直在寻找一种方法来重用我的MVC Razor视图作为客户端渲染的javascript模板,并找到了this library(Razor客户端模板),它将剃刀视图解析为javascript函数。

它不会与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的其余部分都失败了。

enter image description here

1 个答案:

答案 0 :(得分:3)

标准剃刀解析器无法识别@model关键字。 @model关键字来自System.Web.Mvc程序集中的MvcCSharpRazorCodeParser类。

此主要功能来自SetModelTypeCodeGenerator。此类使用核心剃刀引擎类SetBaseTypeCodeGenerator将剃刀视图的基本类型从默认WebViewPage更改为WebViewPage<Model>

解决方案

使用@inherits关键字代替,例如@inherits WebViewPage<EntityModel>

或者,添加对System.Web.Mvc的引用,并使用自定义语言将代码解析器更改为MvcCSharpRazorCodeParser。您需要将RazorEngine.DefaultBaseClass属性设置为您要使用的基类的非泛型版本,例如对于WebViewPage<T>,您需要设置engine.DefaultBaseClass = "System.Web.Mvc.WebViewPage"

class MvcCSharpRazorCodeLanguage : CSharpRazorCodeLanguage
{
    public override ParserBase CreateCodeParser()
    {
        return new MvcCSharpRazorCodeParser();
    }
}