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

使用Razor.Language从Blazor Razor生成C#代码结果异常如何解决

问题根因

你直接使用RazorConfiguration.Default创建引擎的方式是错误的:该默认配置面向传统Razor Pages/MVC视图场景,没有加载Blazor组件编译所需的语法解析规则、指令处理器和代码生成逻辑,因此会把包含@onclick这类Blazor专属绑定语法的元素整体识别为静态标记,输出AddMarkupContent形式的错误代码。

解决步骤

1. 补充依赖包

仅安装Microsoft.AspNetCore.Razor.Language不足以支持Blazor组件编译,需要额外安装同版本的Blazor Razor扩展包:

<PackageReference Include="Microsoft.AspNetCore.Components.Razor.Extensions" Version="6.0.5" />

2. 正确初始化RazorProjectEngine

不要直接使用默认配置,手动构建适配Blazor组件的编译管道,示例代码如下:

using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Components.Razor.Extensions;

// 构建Blazor专属Razor配置
var blazorConfig = RazorConfiguration.Create(
    RazorLanguageVersion.Version_6_0,
    "Blazor",
    new[]
    {
        new AssemblyExtension(
            "Microsoft.AspNetCore.Components.Razor.Extensions",
            typeof(ComponentDocumentClassifierPass).Assembly
        )
    }
);

// 初始化引擎,注册Blazor编译默认管道
var engine = RazorProjectEngine.Create(blazorConfig, RazorProjectFileSystem.Create(pathWhereCsProjLives), builder =>
{
    // 注册Blazor组件编译所需的所有语法处理、代码生成规则
    builder.AddBlazorDefaults();
    // 替换为你项目实际的根命名空间,和.csproj里配置的RootNamespace保持一致
    builder.SetRootNamespace("YourProjectRootNamespace");
});

// 显式标记目标文件为Blazor组件类型,避免被识别为普通Razor视图
var targetFile = engine.FileSystem.GetItem("/pages/Counter2.razor", RazorFileKinds.Component);
var codeDoc = engine.Process(targetFile);
var generatedCode = codeDoc.GetCSharpDocument().GeneratedCode;
注意事项
  • 必须调用AddBlazorDefaults()方法注册Blazor编译管道,该方法会自动加载组件分类、事件绑定解析、渲染树代码生成等核心逻辑,是输出符合Blazor规范代码的关键。
  • 生成代码前可检查codeDoc.GetCSharpDocument().Diagnostics集合,排查是否存在缺少全局using、语法解析错误等问题,若要支持全局@using引用,需要确保项目下的_Imports.razor文件能被Razor文件系统正常读取。
  • 配置的语言版本、扩展集要和你使用的SDK版本保持一致,避免出现生成代码和运行时版本不兼容的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:36:22