如何在两个不同的DotNetNuke(DNN)模块中使用相同的Web用户控件?

时间:2010-02-18 18:40:17

标签: dotnetnuke ascx dotnetnuke-5 dotnetnuke-module web-user-controls

我正在为客户开发一些模块,这些模块将使用通用Web用户控件共享一些用户界面功能来提供UI。当我编写第一个模块并添加到.ascx文件中时,一切都很好。当我将相同的控件添加到第二个模块时,我收到以下错误:

  

DotNetNuke.Services.Exceptions.ModuleLoadException:   类型   'XXX.ParametersControl.ParameterTabControl'   含糊不清:它可能来自   部件   'C:\ CLIENTS \ XXX \代码\报告\ DotNetNuke_BaseInstall \ BIN \ XXX.KPI_Configurable_Chart.DLL'   或从集会   'C:\ CLIENTS \ XXX \代码\报告\ DotNetNuke_BaseInstall \ BIN \ XXX.Survey_Grid.DLL'。请明确指定程序集   在类型名称中。

两个模块安装和运行都没有这个额外的UI控件。

我开发了UI控件作为一个单独的项目,它为包含的后端功能编译它自己的DLL,然后在模块安装文件中只使用编译的DLL和控制ASCX文件部署应用程序。

主要模块中的包含ASCX是这样完成的:

  

<%@注册   SRC = “ParameterControl / ParameterTabControl.ascx”   标记名= “ParameterTabControl”   tagprefix =“uc1”%>   

正如您所看到的,我通过从子目录中获取它来包含接口控件,我将其作为Subversion外部实现。

我在主模块的.vb代码隐藏中引用控件的对象和属性,如下所示:

ParameterTabControl1.DateRangeTabVisible = True
If (ParameterTabControl1.StartDate Is Nothing) Then
     ParameterTabControl1.StartDate = DateAdd(DateInterval.Day, -90, Now)
End If

有关如何设计这一点的任何提示都不会发生吗?有些方法让子控件ASCX只连接到它自己的DLL而不是绑定到主模块控件,同时仍允许我查询控件上的属性和对象来设置和获取它的属性?

2 个答案:

答案 0 :(得分:2)

您是否尝试在@ Register标记中指定共享程序集和/或命名空间?我不知道您的共享组件的确切值,但您可以准确指定要使用的命名空间和程序集:

<%@ Register src="ParameterControl/ParameterTabControl.ascx"
tagname="ParameterTabControl" tagprefix="uc1" assembly="XXX.SharedControls"
namespace="My.Shared.Control" %>  

查看@ Register documentation了解详情。

答案 1 :(得分:0)

我认为我使用解决方法打破了项目之间的联系,从而解决了这个问题。将它们放在与主要控制器相同的解决方案中似乎是个问题。我从DNN模块的解决方案中取出了ParameterTabControl,只需在VS的第二个副本中打开它。如果没有VS中的“项目引用”,它只是直接将代码链接到DLL,而不会导入DLL命名空间。

我必须在ParameterTabControl中添加一些后期构建事件,以自动将新DLL推送到测试平台,以防止两个DNN模块解决方案之间的版本控制问题,但这不是太多工作。然后,最新的通用DLL始终可用,并且它们在编译时都看到相同的版本。这是一个黑客,但它的工作原理。

有一次,我对于抛出和显示的错误的完整性和正确性感到惊喜。

感谢Lance和Ian。