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的
更为精确的修改代码应该是:
4、 标题中的例外
但是,DNN中还支持[TITLE:1]的写法,在由HTML编译为ascx时,DNN将该对象的ID改为了“dnnTITLE1”,所以有时你在
Control title = (Control)this.ContainerControl.FindControl("dnnTITLE");
时返回null。
所有我们的程序被迫改写为