2

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

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

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

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

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

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

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

4

3 回答 3

1

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

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

于 2012-05-08T19:31:21.400 回答
1

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

就我而言,我尝试设置不同的模块设置并在 Page_Load() 对此设置做出不同的反应。

我决定使用

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

GUID 将帮助我保持 Session 的唯一性。List<> 将使用 ModuleID、mySpecialSetting 存储我的特殊设置。

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

最好的问候,没有人。

于 2012-05-09T10:49:56.263 回答
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 会将其添加到源代码中:)

于 2012-05-09T21:34:59.377 回答