1

我正在开发一个 DotNetNuke 模块,该模块由几个不同的屏幕组成,每个屏幕都有自己的一组用户界面交互。我决定通过将每个屏幕放在不同的模块控件中来处理这个问题。我能找到加载该控件的唯一方法是通过以下方式为链接提供 URL:

Globals.NavigateURL(Constants.LicenseDetailControl, "clientId=" + _clientId, "licenseId=" + data.Id, "mid=" + this.ModuleId);

不幸的是,由于mid=xxx查询参数,这将页面限制为仅呈现此特定模块。但是,如果我不提供模块 ID 参数,那么我的控件根本不会呈现并且页面是空白的。

有没有办法在不强制页面只显示一个模块的情况下呈现特定控件?

4

2 回答 2

3

有没有办法在不强制页面只显示一个模块的情况下呈现特定控件?

答案是不。

通过指定 ctl 类型和模块 ID 来渲染特定控件通常用于编辑和管理模块,它们专门从页面中排除其他模块。

正如 Mitchel 所回答的,您必须自己进行动态加载。还有其他模块可以执行此操作,您可以复制模式。许多 Ventrian 模块使用它们自己的 Url 规范来加载不同的控件(这意味着不要在 Url 中使用 /ctl/xx 和 /mid/yy,而是用您自己的定义替换它,例如 'view=x')

但是,您也可以考虑将模块分散到不同的页面,以便一个 DNN 页面具有“列表”,而另一个页面具有“视图”。这提供了一组更合乎逻辑的 URL(想象一个名为 /licences 的许可证列表页面,然后是一个名为 /licence/licenceId/xx 的许可证详细信息页面)。它还允许在整个站点中更灵活地使用该模块。但它确实使安装变得不那么直观,因为它只是将所有模块转储在一页上。

不久前我写了一篇关于这个主题的博客文章——试图解释它是如何组合在一起的。它较旧,但仍然相关,可能会为您提供更多信息。 设计、构建和构建 DotNetNuke 模块

或者,正如另一位评论者已经发布的那样,只需对内容进行完整的 AJAX 显示。

于 2012-04-13T04:23:52.790 回答
2

好吧,这个问题的答案并不像你希望的那么简单。您正在查看的情况是所谓的“模块隔离”,从框架的角度来看,没有真正的方法可以绕过它。

但是,对于如何在模块中执行此操作以获得所需的效果,您有一些选择。

  1. 在您的主视图控件中,根据您传递和处理的查询字符串值将实际视图动态加载到 PlaceHolder 中。
  2. 在您的主视图控件中,每个视图都有面板,并根据需要通过参数显示/隐藏它们
  3. 在您的主视图控件中,为每个视图添加子控件。从这里您可以根据需要启用/禁用项目和视图状态来处理视图,再次通过处理参数。

就我个人而言,我选择 1 或 3。一个效果很好并且最干净,但我发现某些控件在动态注入方面存在问题。我更喜欢选项 3,否则我可以禁用所有未呈现的控件上的视图状态,以减小页面大小,否则页面大小会被 2 放大。

于 2012-04-12T17:30:35.353 回答