使用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
相关产品推荐
相关产品推荐

