You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET上下文外通过C#代码解析Razor模板的AST

处理Razor模板AST的可行方案

一、正确利用Microsoft.AspNetCore.Razor.Language的公开API

你无需依赖反射操作内部API,这个库本身提供了完整的公开接口用于生成和遍历Razor AST:

  • 先创建配置好的RazorProjectEngine实例:
    var engine = RazorProjectEngine.Create(RazorConfiguration.Default, RazorProjectFileSystem.Create("."), builder => {
        builder.AddDefaultNamespaces("System");
        // 可根据需求添加自定义指令、命名空间等配置
    });
    
  • 解析Razor内容生成RazorCodeDocument,从中提取语法树:
    var codeDocument = engine.Process(RazorSourceDocument.Create(razorContent, "Template.cshtml"));
    var syntaxTree = codeDocument.GetSyntaxTree();
    
  • 遍历AST可通过SyntaxVisitor或直接访问根节点的子元素,区分HTML标记与C#代码块:
    var root = syntaxTree.Root;
    foreach (var node in root.Children) {
        if (node is MarkupBlockSyntax markupBlock) {
            // 处理HTML标记节点,遍历markupBlock.Children获取具体元素
        } else if (node is CodeBlockSyntax codeBlock) {
            // 处理嵌入C#代码,codeBlock.Code可获取代码内容,还能访问更细粒度的语法节点
        }
    }
    
    官方文档覆盖了这些基础用法,深入查阅即可避免触碰内部API。

二、备选解析库

如果不想使用官方库,有两个维护中的备选方案:

  • RazorSharp:API设计贴近Roslyn风格,专注于Razor语法解析与AST处理,可直接获取HTML节点和C#代码块的结构,无需反射。
  • RazorParser:轻量级解析库,专门提供AST遍历能力,适合简单模板分析场景,依赖更少。

三、结合Roslyn的进阶思路

若需深入分析嵌入的C#代码,可将Razor解析生成的C#代码(从codeDocument.GetCSharpDocument().GeneratedCode获取)交给Roslyn处理,既能拿到HTML结构,又能利用Roslyn强大的C# AST分析能力。

内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:00