gpt4 book ai didi

c# - RazorTemplateEngine 解析器产生不寻常的语法树

转载 作者:行者123 更新时间:2023-11-30 16:20:27 27 4
gpt4 key购买 nike

我一直在寻找一种方法来重用我的 MVC Razor View 作为客户端呈现的 javascript 模板,并找到了 this library (Razor 客户端模板)将 Razor View 解析为 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 引擎将 View 拆分为不同类型的“ block ”和“跨度”。但如图所示,顶部的模型声明已被解析为标记,而不是代码。也有类似的奇怪之处,因此,对 javascript 的其余解析失败。

enter image description here

最佳答案

标准 Razor 解析器无法识别 @model关键词。 @model关键词来自MvcCSharpRazorCodeParser System.Web.Mvc 中的类组装。

主要功能来自 SetModelTypeCodeGenerator .此类使用核心 Razor 引擎类,SetBaseTypeCodeGenerator从默认的 WebViewPage 更改 Razor View 的基本类型至 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();
}
}

关于c# - RazorTemplateEngine 解析器产生不寻常的语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com