3

我正在寻找一种方法来重用我的 MVC Razor 视图作为客户端渲染的 javascript 模板,并找到了将 razor 视图解析为 javascript 函数的这个库(Razor Client Template)。

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

在此处输入图像描述

4

1 回答 1

3

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

主要功能来自SetModelTypeCodeGenerator。此类利用核心剃须刀引擎类SetBaseTypeCodeGenerator将剃须刀视图的基本类型从默认更改WebViewPageWebViewPage<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();
    }
}
于 2013-01-08T20:42:30.470 回答