【问题标题】:RazorTemplateEngine parser produces unusual syntax treeRazorTemplateEngine 解析器生成不寻常的语法树
【发布时间】:2013-01-08 19:45:51
【问题描述】:

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

它与 Razor 引擎版本 2 不兼容,稍微挖掘一下表明这是因为 Razor 引擎的语法树已经过大修。在尝试修改内容时,我从 RazorViewEngine 解析器中发现了一些奇怪的结果。

我有一个非常简单的观点,像这样:

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

razor 客户端模板库开始于:

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 的解析都失败了。

【问题讨论】:

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


    【解决方案1】:

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

    主要功能来自SetModelTypeCodeGenerator。该类利用核心剃须刀引擎类SetBaseTypeCodeGenerator 将剃须刀视图的基本类型从默认的WebViewPage 更改为WebViewPage&lt;Model&gt;

    解决方案

    请改用 @inherits 关键字,例如@inherits WebViewPage&lt;EntityModel&gt;.

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多