最近在基于DNN开发一个网站,发现一件有趣的事情。
由于业务逻辑有许多可以抽取的共性,我将一个用于筛选的功能做成了用户控件(UserControl,为了方便叙述,我们称它为Filter),并把它放在DNN的Controls目录下,即\DotNetNuke\controls,以便各个模块均可调用。这个用户控件很简单,就是一些下拉框,用于对数据进行查询,我将下拉框的SelectedValue封装成公共属性,这样就可以从外部调用了。比如,里面的一个属性是这样写的:
'项目名称
Public Property ProjectName() As String
Set(ByVal Value As String)
_ProjectName = Value
End Set
Get
Return Me.sltProjectName.SelectedValue
End Get
End Property
这是几句VB.NET代码,当读取这个公共属性的时候,我就返回相应的下拉框(sltProjectName)的选中值(SelectedValue)。
很简单。
然后在自己编写的DNN模块(DesktopModules)中,这样使用它:
1、首先,在VS的“HTML”视图中,在顶部添加对它的引用:
<%@ Register TagPrefix="dnn" TagName="CSBSGFilter" Src="~/controls/CSBSGFilter.ascx" %><%@ Register TagPrefix="dnn" TagName="CSBSGFilter" Src="~/controls/CSBSGFilter.ascx" %><%@ Register TagPrefix="dnn" TagName="Filter" Src="~/controls/Filter.ascx" %>
2、然后,在HTML中合适的位置,添加一个引用实例,比如在一个单元格中:
<TD><dnn:Filter ></dnn:Filter>
这就相当于已经创建了一个实例,只需声明一下,与之匹配上就可以了,而这句话又创建了一个实例,覆盖了原本存在的那个,就导致了错误。(大致如此罢,我没有搞很明白,这块挺复杂的)
总之,记在这里罢,究竟是什么原因,欢迎大家拍砖。以后有相同迷惑的朋友也可以做一个参考,遇到这种情况百思不得其解的时候,试试这种方法,或许能够解决。
相关文章: