打造可持续发展的事业

事业像系统的框架,要稳定、可扩展,同样需要精心设计的!

通过程序动态修改DNN模块标题

  

1、 什么是模块的标题?

DNN Skin&Container开发的官方文档中定义了标题,如下图

 


在对应的
Container HTML文件中(DNN会将HTML“编译”为ascx文件来使用,基本上是将[XXX]类型的标签替换成DNN定义的Control),是这样的

<TD background="tile_body_top.jpg" align="middle" noWrap>[SOLPARTACTIONS]</TD>

<TD background="tile_body_top.jpg" align="middle" width="100%" nowrap>[TITLE]</TD>

<TD background="tile_body_top.jpg" align="middle" noWrap>[VISIBILITY]</TD>

<TD vAlign="top" noWrap align="right" width="20" colspan="2">

<IMG src="body_corner_right.jpg" height="42" width="20" border="0"></TD>

 

 

2、 通常如何设置标题?

标题一般在管理模式下,加入模块的同时设定。

或者在模块的Setting页面进行修改。

可是有时我们会要求能够通过程序动态修改模块的标题。 


3、 如何访问标题?

经过摸索,这样是可以访问了:

Label lbTitle = ((Label)(this.ContainerControl.FindControl("dnnTITLE").Controls[0]));

lbTitle.Text = objBookItem.Title;

其中我们知道,this(模块)是继承自PortalModuleBase,而PortalModuleBase中定义了:

public Control ContainerControl { get; }

这个就是我们的容器对象了。


它只是一个普通的
UserControl而已。它包含了若干控件,其中有dnn:TITLE它的ID为“dnnTITLE”,我们通过FindControl可以找到它。

<%@ Control language="vb" CodeBehind="~/admin/Containers/container.vb" AutoEventWireup="false" Explicit="True" Inherits="DotNetNuke.UI.Containers.Container" %>

<%@ Register TagPrefix="dnn" TagName="ACTIONS" Src="~/Admin/Containers/SolPartActions.ascx" %>

<%@ Register TagPrefix="dnn" TagName="ICON" Src="~/Admin/Containers/Icon.ascx" %>

<%@ Register TagPrefix="dnn" TagName="TITLE" Src="~/Admin/Containers/Title.ascx" %>

<%@ Register TagPrefix="dnn" TagName="VISIBILITY" Src="~/Admin/Containers/Visibility.ascx" %>

     

                <TD valign="middle" nowrap><dnn:ACTIONS runat="server" id="dnnACTIONS" /></TD>

                <TD valign="middle" nowrap><dnn:ICON runat="server" id="dnnICON" /></TD>

                <TD valign="middle" width="100%" nowrap>

<dnn:TITLE runat="server" id="dnnTITLE" />

</TD>

            

ascx文件中可以看出dnnTitle也是一个Control,如何更改名称呢?

看源文件~/Admin/Containers/Title.ascx

Title中包含一个DNNLabelEdit:

<%@ Control Language="vb" AutoEventWireup="false" Inherits="DotNetNuke.UI.Containers.Title" CodeFile="Title.ascx.vb" %>

<%@ Register TagPrefix="dnn" Namespace="DotNetNuke.UI.WebControls" Assembly="DotNetNuke.WebControls" %>

<dnn:DNNLabelEdit id="lblTitle" runat="server" cssclass="Head" enableviewstate="False" MouseOverCssClass="LabelEditOverClass"

     LabelEditCssClass="LabelEditTextClass" EditEnabled="True"></dnn:DNNLabelEdit>

DNNLabelEdit是继承自Label

 


更为精确的修改代码应该是:

 

Control title = (Control)this.ContainerControl.FindControl("dnnTITLE");

if (title != null)

{

Label lbTitle 
= title.FindControl("lblTitle"as as Label;

if (lbTitle != null)

{

lbTitle.Text 
= objTYDMItem.Title;

}


}



4、 标题中的例外

但是,DNN中还支持[TITLE1]的写法,在由HTML编译为ascx时,DNN将该对象的ID改为了dnnTITLE1,所以有时你在

Control title = (Control)this.ContainerControl.FindControl("dnnTITLE");

时返回null

 

所有我们的程序被迫改写为

 

foreach (Control ctl in this.ContainerControl.Controls)

            
{

                
if (ctl.ID == null)

                    
continue;

                
if (Regex.IsMatch(ctl.ID, "dnnTITLE"))

                
{

                    lbTitle 
= title.FindControl("lblTitle"as Label;

break;

                }


            }

posted on 2006-06-26 18:48  PM2004  阅读(1502)  评论(2编辑  收藏  举报

导航