我用下面的代码解决了我自己的问题。这不是首选的解决方案,但我使用它取得了成功,并且在 DNN 实施真正的解决方案之前它会起作用。
类中的所有方法都Controller
连接数据库中的自定义表。代码检查所有模块定义是否在当前页面(选项卡)上并且不在数据库中。如果不是,它将结合新的实例 ID 将其添加到数据库中。如果页面中添加了 2 个或更多相同的模块并且此代码稍后运行(例如更新),它将仅获取顺序的模块 id(其他模块 id 将稍后添加)。
ModuleInstanceId = Controller.GetModuleInstanceId(TabModuleId);
if (ModuleInstanceId == -1)
{
Dictionary<Int32, String> ModuleInstanceDefinitions = new Dictionary<Int32, String>();
Dictionary<String, ModuleDefinitionInfo> ModuleDefinitions = new ModuleController().GetModule(ModuleId).DesktopModule.ModuleDefinitions;
foreach (ModuleDefinitionInfo ModuleDefinition in ModuleDefinitions.Values)
{
List<ModuleInfo> Modules = new ModuleController().GetModulesByDefinition(PortalId, ModuleDefinition.FriendlyName).ToList<ModuleInfo>();
foreach (ModuleInfo Module in Modules)
{
if (Module.TabID == TabId)
{
if (Controller.GetModuleInstanceId(Module.TabModuleID) == -1 || Controller.GetModuleInstanceId(ModuleDefinition.FriendlyName) == -1)
{
ModuleInstanceDefinitions.Add(Module.TabModuleID, ModuleDefinition.FriendlyName);
}
}
}
}
// Probably shouldn't be more then specified in the manifest;
// Only situatie this could occure is when the module is added to a page twice at the same page;
ModuleInstanceDefinitions = ModuleInstanceDefinitions.OrderBy(ModuleDefinition => ModuleDefinition.Key).Take(ModuleDefinitions.Count).ToDictionary(Item => Item.Key, Item => Item.Value);
ModuleInstanceId = Controller.SetModuleInstances(ModuleInstanceDefinitions);
}
希望有人会发现这很有用,或者 DNN 会将其添加到源代码中:)