将2sxc应用注入DNN模板时触发空引用异常,求排查方案
问题
我正尝试按照WolfXMachina的教程将2sxc应用注入DNN模板文件,教程代码如下:
<%@ Import Namespace="DotNetNuke.Entities.Modules" %> <%@ Import Namespace="ToSic.Sxc.Dnn" %> <%@ Import Namespace="ToSic.Sxc.Services" %> <% var moduleController = new ModuleController(); ModuleInfo footerModule = moduleController.GetModule(39, 394); if (footerModule != null) { %> <%= this.GetScopedService<IRenderService>().Module(39, 394) %> <% } %>
我已确认页面ID,并从2sxc应用列表中获取了应用ID,但运行时出现以下空引用异常:
DotNetNuke.Services.Exceptions.Exceptions - DotNetNuke.Services.Exceptions.PageLoadException: Object reference not set to an instance of an object. ---> System.NullReferenceException: Object reference not set to an instance of an object. at ToSic.Sxc.Dnn.DnnModuleAndBlockBuilder.GetModuleImplementation(Int32 pageId, Int32 moduleId) in C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn.Core\Dnn\DnnModuleAndBlockBuilder.cs:line 30 at ToSic.Sxc.Blocks.ModuleAndBlockBuilder.GetBlock(Int32 pageId, Int32 moduleId) in C:\Projects\2sxc\2sxc\Src\Sxc\ToSic.Sxc\Blocks\ModuleAndBlockBuilder.cs:line 25 at ToSic.Sxc.Blocks.RenderService.Module(Int32 pageId, Int32 moduleId) in C:\Projects\2sxc\2sxc\Src\Sxc\ToSic.Sxc\Blocks\Renderers\RenderService.cs:line 124 at ToSic.Sxc.Dnn.Services.DnnRenderService.Module(Int32 pageId, Int32 moduleId) in C:\Projects\2sxc\2sxc\Src\Dnn\ToSic.Sxc.Dnn.Core\Dnn\Services\DnnRenderService.cs:line 37
请问我操作中存在哪些错误?或者是否有其他获取应用ID的途径?
解决分析
核心错误:混淆了应用ID和模块ID
教程代码里的GetModule(模块ID, 页面ID)和RenderService.Module(模块ID, 页面ID),第一个参数是模块ID(即你添加到页面上的2sxc模块的ID),但你误用了从2sxc应用列表拿到的应用ID,导致系统找不到对应模块,触发空引用异常。正确获取模块ID的方法
- 先把目标2sxc应用添加到任意DNN页面,右键模块选择「设置」,在打开的页面URL中找到
mid=xxx,xxx就是模块ID; - 登录DNN后台,进入「内容→页面管理」,找到包含该模块的页面,点击「编辑页面内容」,右键模块选择「复制模块ID」(部分DNN版本支持);
- 直接查询DNN数据库的
Modules表,通过模块标题或关联的DesktopModuleID(2sxc的桌面模块ID)筛选出目标模块的ModuleID字段值。
- 先把目标2sxc应用添加到任意DNN页面,右键模块选择「设置」,在打开的页面URL中找到
修正后的代码示例
假设你的模块ID是123,页面ID是394,代码应修改为:<%@ Import Namespace="DotNetNuke.Entities.Modules" %> <%@ Import Namespace="ToSic.Sxc.Dnn" %> <%@ Import Namespace="ToSic.Sxc.Services" %> <% var moduleController = new ModuleController(); ModuleInfo footerModule = moduleController.GetModule(123, 394); if (footerModule != null) { %> <%= this.GetScopedService<IRenderService>().Module(123, 394) %> <% } %>额外注意事项
- 确保该模块在对应的页面上处于已发布状态,未发布的模块会导致
GetModule方法返回null; - 若不需要提前校验模块是否存在,可简化代码,但空引用异常说明模块无法被找到,保留判断逻辑能避免页面崩溃。
- 确保该模块在对应的页面上处于已发布状态,未发布的模块会导致
内容的提问来源于stack exchange,提问作者Acer
相关产品推荐
相关产品推荐

