多个DotNetNuke模块定义之间的标识

多个DotNetNuke模块定义之间的标识,dotnetnuke,dotnetnuke-module,dotnetnuke-6,Dotnetnuke,Dotnetnuke Module,Dotnetnuke 6,我在DotNetNuke 6中构建了一个包含多个模块定义的模块。一个模块可以添加到多个页面(选项卡),多个模块可以添加到一个页面(选项卡)。 问题是,我找不到一个标识符将我的所有模块定义从一个实例连接在一起 DesktopModuleId仅对安装的每个模块唯一(而不是每个实例和页面) ModuleId对于每个模块实例和定义都是唯一的 TabModuleId对于每个模块实例、选项卡和定义都是唯一的 因此,我要寻找的是一种在我将模块放到页面上时识别哪些模块定义属于彼此的方法 我发现一篇论坛帖子解释了

我在DotNetNuke 6中构建了一个包含多个模块定义的模块。一个模块可以添加到多个页面(选项卡),多个模块可以添加到一个页面(选项卡)。 问题是,我找不到一个标识符将我的所有模块定义从一个实例连接在一起

DesktopModuleId
仅对安装的每个模块唯一(而不是每个实例和页面)

ModuleId
对于每个模块实例和定义都是唯一的

TabModuleId
对于每个模块实例、选项卡和定义都是唯一的

因此,我要寻找的是一种在我将模块放到页面上时识别哪些模块定义属于彼此的方法

我发现一篇论坛帖子解释了同样的问题,有人建议查看每个定义的
ModuleId
,并检查它们是否是连续的。我觉得这很有意思

编辑:

我正在开发的模块包含许多不同的定义,但假设我们有3个(查看、编辑和设置)。当我安装模块时,我必须设置一个我将用于该模块的类别,比如我希望它是一个博客模块。然后,所有3个定义都将从数据库中获取具有相同唯一id的数据(假定)。现在我再次安装相同的模块,我想选择另一个类别(公文包)并只获取该数据。DNN现在的工作方式是,我无法将我的博客项目与我的公文包项目分开,因为我无法知道我的3个博客定义彼此属于,并且与其他3个公文包定义分开。我希望这是有意义的…

如果每个模块的
DesktopModuleId
是独立的,那么根据DNN,它们之间没有任何关联。
DesktopModule
PackageId
很可能会将它们关联起来,但我还没有看到在同一个包中安装多个桌面模块的方法(包是功能的最高级别)


听起来您希望所有模块定义都包含在一个桌面模块中。在用于安装模块的清单中,确保只有一个
元素和一个
组件[type=“module”]
元素。在该
组件
元素的内部,为模块的每个部分都有一个
模块定义
。然后,可以将单个模块添加到页面中,并在您这样做时包含每个模块(您可以自由删除任何您不需要的模块)。

我不知道您到底想要达到什么目的。 但是,如果我试图在同一页面上多次放置一个模块并保持其“唯一性”,我也会遇到问题

在我的例子中,我尝试设置不同的模块设置,并在页面上对该设置做出不同的反应

我决定使用

Session["8400f2b6-d930-47af-a524-fc16721b4591"] = new List<KeyValuePair<int, string>>();
会话[“8400f2b6-d930-47af-a524-fc16721b4591”]=新列表(); GUID将帮助我保持会话的唯一性。 该列表将使用ModuleID、mySpecialSetting存储我的特殊设置

如果您在同一页面上多次放置一个模块,这可能会帮助您获得独特的特殊模块信息


向你问好,努恩。

我用下面的代码解决了我自己的问题。这不是首选的解决方案,但我成功地使用了它,直到DNN实现了真正的解决方案

Controller
类中的所有方法都连接数据库中的自定义表。代码检查所有模块定义是否在当前页面(选项卡)上,而不在数据库中。如果没有,它将与一个新的实例id一起添加到db中。如果在页面中添加了两个或更多相同的模块,并且该代码稍后运行(例如更新),它将只获得顺序的模块id(其他模块id将稍后添加)

ModuleInstanceId=Controller.GetModuleInstanceId(TabModuleId);
if(ModuleInstanceId==-1)
{
Dictionary ModuleInstanceDefinitions=新字典();
Dictionary ModuleDefinitions=new ModuleController().GetModule(ModuleId).DesktopModule.ModuleDefinitions;
foreach(ModuleDefinitionInfo ModuleDefinitions.Values中的ModuleDefinition)
{
List Modules=new ModuleController().GetModulesByDefinition(PortalId,ModuleDefinition.FriendlyName).ToList();
foreach(模块中的模块信息模块)
{
if(Module.TabID==TabID)
{
if(Controller.GetModuleInstanceId(Module.TabModuleID)=-1 | | Controller.GetModuleInstanceId(ModuleDefinition.FriendlyName)=-1)
{
ModuleInstanceDefinitions.Add(Module.TabModuleID,ModuleDefinition.FriendlyName);
}
}
}
}
//可能不应该超过清单中的规定;
//唯一可能发生这种情况的情况是在同一页面上两次将模块添加到页面中;
ModuleInstanceDefinitions=ModuleInstanceDefinitions.OrderBy(ModuleDefinition=>ModuleDefinition.Key).Take(ModuleDefinitions.Count).ToDictionary(Item=>Item.Key,Item=>Item.Value);
ModuleInstanceId=控制器.SetModuleInstances(ModuleInstanceDefinitions);
}

希望有人会觉得这很有用,或者DNN会将其添加到源代码中:)

jerone-我不太明白。您想知道模块是什么或定义是什么?我想知道页面上模块的唯一id。问题是我不能使用
TabModuleId
,因为这对于我拥有的每个模块定义都是唯一的。我认为我们需要更全面地讨论您的总体目标是什么。我没有看到这个ID(如果它存在的话)意味着什么的上下文,也没有看到你会在什么上下文中使用它。希望我们能为您找到一个可行的解决方案。@bdukes-更新了我目前的情况。我已经成功安装了模块(和其他模块)。我只需要一种识别w的方法
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);
}