You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET 9 Blazor动态加载RCL的静态资源与CSS隔离包失效问题

动态加载RCL的静态资源与CSS隔离生效方案

问题根源

AddAdditionalAssemblies()动态加载RCL时,ASP.NET Core只会处理组件的路由注册,不会自动扫描并注册RCL的静态Web资源(包括CSS隔离包)——静态资源的默认注册逻辑只针对启动时就已引用的程序集,动态加载的程序集会被漏掉。

解决步骤

1. 手动注册静态Web资源

Program.cs里,加载RCL程序集后,必须手动调用StaticWebAssetsLoader来注册其资源:

// 先获取你动态加载的RCL程序集(比如从文件加载,或者其他方式)
var rclAssembly = Assembly.LoadFrom("MyRclAssemblyName.dll");

// 注册该程序集的静态Web资源
StaticWebAssetsLoader.UseStaticWebAssets(builder.Environment, builder.Configuration, new[] { rclAssembly });

// 再添加组件程序集
app.MapRazorComponents<App>().AddAdditionalAssemblies(rclAssembly);

2. 正确引用CSS隔离包

在消费应用的_Layout.cshtml(服务器渲染模式下)里,按标准路径引用RCL的隔离CSS包:

<link href="_content/MyRclAssemblyName/MyRclAssemblyName.bundle.scp.css" rel="stylesheet" />

注意:MyRclAssemblyName必须和RCL项目的程序集名称完全一致(查看RCL的.csproj里的<AssemblyName>节点),大小写不能出错。

3. 自定义静态资源的验证

对于RCL中wwwroot下的styles2.css这类自定义资源,引用路径还是_content/MyRclAssemblyName/styles2.css,同时要确保:

  • RCL里的styles2.css属性设置为嵌入式资源,且“复制到输出目录”设为“如果较新则复制”
  • 启动应用时,RCL程序集确实被加载了(可以用AppDomain.CurrentDomain.GetAssemblies()检查)

4. 开发环境的清理与验证

开发环境下容易有缓存问题,建议:

  • 清理并重新生成整个解决方案
  • 检查RCL的输出目录(bin/Debug/net9.0)里有没有staticwebassets.runtime.json,这个文件是静态资源的映射清单,必须存在

额外提示

  • StaticWebAssetsLoader属于Microsoft.AspNetCore.Mvc.TagHelpers包,.NET9的Blazor Web App默认已经包含,不用额外安装
  • 如果是从外部路径加载RCL(不是项目引用),要确保RCL的输出文件完整,包括staticwebassets.runtime.json和所有资源文件

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

火山引擎 最新活动