如何区分同一页面内的同一2sxc应用多实例以切换数据?
区分同一2sxc应用的多个实例的最优方案
我刚好遇到过完全一样的场景——在同一页面部署多个2sxc日历应用实例,每个对应不同场馆的活动。你现在用模块标题的方式确实不够优雅,下面几个方案应该能完美解决你的问题:
方案1:使用模块级自定义设置(推荐)
这是最直接、官方推荐的方式,因为2sxc本身就支持给每个模块实例配置独立的参数,而非应用全局的设置。步骤如下:
- 打开你的2sxc应用的Configuration页面,切换到Module Settings标签(注意不是App Settings)。
- 点击Add Field,创建适配你场景的字段:
- 可选Dropdown类型,预设你的3个地点名称(或者关联到地点的内容项)
- 也可用Text字段直接填写地点标识
- 保存设置后回到页面编辑模式,分别编辑每个日历模块实例:在模块的2sxc设置面板里,就能看到你刚创建的模块级字段,给每个实例选择对应的地点。
- 在视图代码里,直接读取这个模块专属的设置值:
之后就可以用// 读取模块级设置的地点值,键名对应你创建字段时的名称 var clubLocation = @Module.Settings.Get("ClubLocation");clubLocation变量过滤对应地点的活动数据了。
方案2:利用唯一的ModuleId关联配置
每个模块实例(哪怕是同一应用、同一页面)都有唯一的ModuleId,你可以用这个ID绑定专属配置:
- 在2sxc里创建一个新的Content Type,比如叫
ModuleLocationMapping,包含两个字段:ModuleId(数字类型,存储模块的ID)ClubLocation(文本/下拉类型,对应地点)
- 给每个日历模块实例创建一条映射记录:先通过视图临时输出
@Dnn.Module.ModuleId获取模块ID,再绑定对应的地点。 - 在视图代码里,获取当前模块ID并查询对应映射:
这个方案适合需要更复杂配置的场景,比如除了地点还要绑定其他参数。var currentModuleId = @Dnn.Module.ModuleId; var locationMapping = App.Data["ModuleLocationMapping"].First(m => m.ModuleId == currentModuleId); var clubLocation = locationMapping.ClubLocation;
方案3:使用DNN模块的自定义参数
如果你不想在2sxc里额外配置字段,也可以用DNN原生的模块参数:
- 编辑每个日历模块实例,打开Settings -> Advanced Settings -> Module Settings(DNN原生设置,不是2sxc的)。
- 在Custom Settings里添加键值对,比如
Club=Downtown、Club=WestSide等。 - 在2sxc视图里读取这个参数:
这个方式比较轻量,但配置界面不如2sxc的模块设置友好。var clubLocation = @Dnn.Module.Settings["Club"];
为什么之前的方法不行?
你提到的@App.Settings或@App.Resources是应用级别的配置,同一Zone下的所有应用实例都会共享这些值,所以无法区分不同实例。而@App.AppId/@AppGuid是应用本身的标识,同一应用的所有实例自然相同,也没法用来区分。
希望这些方案能帮到你,我自己用方案1解决了类似的多场馆日历问题,体验很好!
内容的提问来源于stack exchange,提问作者Frédéric Laurent
相关产品推荐
相关产品推荐

