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

时间:2012-05-08 09:33:26

标签: dotnetnuke dotnetnuke-module dotnetnuke-6

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

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

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

TabModuleId对于每个模块实例都是唯一的,并且标签和定义

所以我正在寻找的是一种在我将模块放在页面上时识别哪些模块定义彼此属于的方法。

我找到了一个论坛帖子,它解释了同样的问题,有人建议查看每个定义的ModuleId并检查它们是否是连续的。我觉得非常hackies。

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

3 个答案:

答案 0 :(得分:1)

如果DesktopModuleId对于每个模块是独立的,那么它们根据DNN没有任何关联。 PackageId的{​​{1}}与它们相关的可能性很小,但我没有看到在同一个软件包中安装多个桌面模块的方法(并且软件包是功能包含的最高级别) )。

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

答案 1 :(得分:1)

我不知道你想要达到的目标。 但是,如果我试图将一个模块放在同一页面上并且保持它并且#34;唯一的"那么我也会遇到问题。

在我的情况下,我尝试设置不同的模块设置,并在此设置上对Page_Load()做出不同的反应。

我决定使用

Session["8400f2b6-d930-47af-a524-fc16721b4591"] = new List<KeyValuePair<int, string>>();

GUID将帮助我保持会话的独特性。 列表&lt;&gt;将使用ModuleID,mySpecialSetting存储我的特殊设置。

如果您将一个模块多次放在同一页面上,这可能会帮助您获取特殊模块信息。

最好的问候,没有人。

答案 2 :(得分:0)

我用下面的代码解决了我自己的问题。它不是首选解决方案,但我成功使用它,直到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会将其添加到源代码中:)