我正在为客户开发一些模块,这些模块将使用通用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而不是绑定到主模块控件,同时仍允许我查询控件上的属性和对象来设置和获取它的属性?
答案 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。