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

  

1、 什么是模块的标题?

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

 

通过程序动态修改DNN模块标题
在对应的
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页面进行修改。

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

通过程序动态修改DNN模块标题
3、 如何访问标题?

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

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

lbTitle.Text = objBookItem.Title;

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

public Control ContainerControl { get; }

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

通过程序动态修改DNN模块标题
它只是一个普通的
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

 

通过程序动态修改DNN模块标题
更为精确的修改代码应该是:

 

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;

                }


            }

你可能感兴趣的:(动态)