1

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

DotNetNuke.Services.Exceptions.ModuleLoadException:“XXX.ParametersControl.ParameterTabControl”类型不明确:它可能来自程序集“C:\Clients\XXX\Code\Reporting\DotNetNuke_BaseInstall\bin\XXX.KPI_Configurable_Chart.DLL”或程序集'C:\Clients\XXX\Code\Reporting\DotNetNuke_BaseInstall\bin\XXX.Survey_Grid.DLL'。请在类型名称中明确指定程序集。

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

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

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

<%@ Register src="ParameterControl/ParameterTabControl.ascx" tagname="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 而不是绑定到主模块控件,同时仍然允许我查询控件上的属性和对象以设置和获取它的属性?

4

2 回答 2

2

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

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

查看@Register 文档以获取更多信息。

于 2010-02-18T18:53:30.210 回答
0

我认为我使用一种解决方法来打破项目之间的联系,很好地解决了这个问题。将它们都放在与主控件相同的解决方案中似乎是问题所在。我将 ParameterTabControl 从 DNN 模块的解决方案中拉出来,然后在 VS 的第二个副本中打开它。如果没有 VS 中的“项目引用”,它只会将代码直接链接到 DLL,并且不会导入 DLL 命名空间。

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

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

谢谢兰斯和伊恩。

于 2010-02-20T17:58:58.910 回答