我可以在不将页面限制到特定模块的情况下呈现DotNetNuke模块的控件吗?

时间:2012-04-12 13:13:42

标签: c# dotnetnuke dotnetnuke-module

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

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

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

有没有办法渲染特定的控件而不强制页面只显示一个模块?

2 个答案:

答案 0 :(得分:3)

  

有没有办法渲染特定的控件而不强制页面只显示一个模块?

答案不是。

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

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

但是,您还可以查看在不同页面上传播模块,以便一个DNN页面具有“列表”而另一个具有“视图”。这提供了一组更合理的Url(想象一下名为/ licenses的许可证列表页面,然后是名为/ license / licenceId / xx的许可证详细信息页面)。它还允许在整个站点中使用模块的更大灵活性。但它确实使安装不那么直观,因为它只是将所有模块转储到一页上。

我不久前写了一篇关于这个主题的博客文章 - 试图解释它们是如何组合在一起的。它虽旧,但仍然相关,可能会提供更多信息。 Designing, Structuring and Architecting DotNetNuke Modules

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

答案 1 :(得分:2)

嗯,答案并不像你希望的那么容易。您正在考虑的情况是所谓的“模块隔离”,从框架的角度来看,没有真正的解决方法。

但是,您可以在模块中使用一些选项来获得所需的效果。

  1. 在主视图控件中,根据您传递和处理的查询字符串值,将实际视图动态加载到PlaceHolder中。
  2. 在主视图控件中,每个视图都有面板,并根据需要通过参数显示/隐藏它们
  3. 在主视图控件中为每个视图添加子控件。从这里开始,您可以根据需要启用/禁用项目和viewstate来处理视图,同样通过处理参数。
  4. 我个人使用1或3.一个效果很好并且最干净,但我发现一些控件存在动态注入问题。我更喜欢选项3,因为我可以在所有未被渲染的控件上禁用viewstate,以减少原本会被2膨胀的页面大小。