
大家好我是码农刚子。这是「Radzen 实战」第 1 篇复盘 SPcbERP 里那些差点出事的真实坑。SPcbERP 是 PCB 行业 ERP前端用 Radzen.Blazor 搭。项目跑了小半年一直稳。上个月做依赖升级把 Radzen.Blazor 从 5.x 升到 6.0.0。编译一次过dotnet run 正常浏览器一打开——白屏。控制台报一串看不懂的错。来回折腾两天才理清一共四个坑一个比一个隐蔽。今天全写出来你升级的时候照着对一遍能省两天。01 坑一NU1107依赖版本打架这个坑最直接编译就报不会等到运行。报错原文NU1107: Version conflict detected for Microsoft.AspNetCore.Components.Web. Reference the package directly from the project to resolve this issue. SPcbERP - Radzen.Blazor 6.0.0 - Components.Web ( 8.0.10) SPcbERP - Components.Web ( 7.0.0)翻译一下Radzen.Blazor 6.0.0 要 Components.Web 8.0.10 以上你项目里直接引了 7.0.0两边对不上。麻烦的是.NET 8 项目里 Components.Web 本来是框架隐式提供的正常根本不用手写版本。但一旦你因为某个功能手动引了一次版本就被钉死了升级 Radzen 时就会撞。SPcbERP / \ Radzen.Blazor 6.0.0 Components.Web 传递依赖 项目里手动引用 | | 要求 8.0.10 要求 7.0.0 \ / ⚡ NU1107 版本冲突三个办法按省事程度排一、删掉手动引用。如果那个直接引用不是必需的删掉让 Radzen 的传递依赖决定版本。最干净。二、显式对齐版本。在 csproj 里把 Components.Web 显式指到 8.0.10 以上和 Radzen 的要求一致。三、锁 Radzen 版本。暂时升不上去就先别升等依赖链理顺再说。顺序提醒先解决 NU1107再谈其他坑。编译不过后面的错根本看不到。02 坑二DataGrid 分页Count 得自己赋值编译过了页面能开了但表格分页不对。RadzenDataGrid 做服务端分页用LoadData事件。6.0 里这个事件的参数类型是DataGridLoadDataEventArgs里面有Skip和Top但没有 Count。总条数得你自己查出来赋给args.Count。不赋值分页器不知道一共多少条只能显示一页。只查数据忘了 Countasync Task LoadData(DataGridLoadDataEventArgs args) { args.Data await db.Orders .OrderBy(o o.Id) .Skip(args.Skip).Take(args.Top) .ToListAsync(); // args.Count 没赋值 → 分页器算不出总页数 }数据 总数一起给async Task LoadData(DataGridLoadDataEventArgs args) { var query db.Orders.AsQueryable(); // 总数单独查一次 args.Count await query.CountAsync(); args.Data await query .OrderBy(o o.Id) .Skip(args.Skip).Take(args.Top) .ToListAsync(); }代价是多一次COUNT查询。但这是服务端分页绕不开的成本——分页器要知道总页数就得知道总数。除非你关掉分页器改用「上一页/下一页」的游标式导航。顺带一提LoadData在筛选、排序变化时也会触发。你的 Count 查询必须和 Data 查询用同一套筛选条件否则筛选后页数还是按全表算的会出现「筛出来 3 条却有 5 页」。03 坑三DialogService 的泛型和默认尺寸第三个坑是弹窗。表现有两种要么弹不出来要么弹出来窄得像手机屏。6.0 里DialogService.OpenAsync的泛型推断更严格了DialogOptions的Width/Height不显式指定的话默认值和 5.x 不一样。靠默认值撑满await DialogService.OpenAsyncEditOrder( 编辑订单, new Dictionarystring, object { { Id, id } }); // 6.0 里默认宽度变了弹窗变得很窄尺寸和泛型都写死await DialogService.OpenAsyncEditOrder( 编辑订单, new Dictionarystring, object { { Id, id } }, new DialogOptions { Width 800px, Height 600px, Resizable true });还有一个相关的Close()的传参。如果你的弹窗要返回值OpenAsyncT的T是返回类型Close(null)在 6.0 里会因为推断不出类型而编译失败。老老实实写Close(default(T))或者干脆改成Close(false)这种能推断出类型的值。经验凡是「靠默认值生效」的地方升级时都要重新显式声明一遍。默认值是库的内部决定它改了不会通知你。04 坑四样式类名变了自定义 CSS 全失效这个坑最难查因为它不报错。页面看着「没坏」但变丑了——表格边框没了、按钮圆角没了、对话框标题栏变白。原因是 6.0 调整了组件生成的 DOM 结构和 CSS 类名。你项目里针对老类名写的覆盖样式一条都不生效了。我的建议是别去覆盖 Radzen 的具体类名用它的主题 CSS 变量。类名是内部实现换个版本就可能变CSS 变量才是对外承诺的接口。排查方法也很土但有效升级后拿浏览器 DevTools 对着一个表格、一个按钮、一个弹窗逐个对比 DOM 和计算样式。半小时能捞干净。05 升级 Radzen 的避坑清单时机动作升级前翻一遍 release notes 里的 breaking changes别只看版本号升级前先看依赖树把 NU1107 这类冲突提前排掉升级后服务端分页的表格逐个确认 Count 有回填升级后弹窗全部显式指定 Width/Height 和泛型参数升级后过一遍视觉回归重点看表格、按钮、对话框长期锁死包版本别用浮动版本号升级当成一次小项目做四个坑里NU1107 是硬错误编译就拦你剩下三个都是软错误——不报错只是行为变了。软错误才最耗时间因为你得先意识到「它变了」。一句话总结升级组件库别只看版本号。依赖冲突先排掉靠默认值的地方全部显式写一遍升完做一次视觉回归。你在 Radzen 或者别的组件库上栽过最贵的坑是啥评论区唠唠。转发给正在做依赖升级的同事少走我们趟过的弯路。下一篇聊SaveChanges 一万行换批量操作快 10 倍。关于作者码农刚子六年 ERP / 制造业系统开发专注 C# / .NET / Blazor。博客原文Radzen 6.0.0 这几个 API 坑我替你踩了 - 码录集