自定义控件在网页上显示“最后修改”日期/时间
一个非常简单的自定义控件,用于显示页面(*.aspx 文件)最后修改的日期/时间。可直接放入工具箱并在设计时使用。
为您的网页添加“最后修改”日期/时间

引言
使用这里提供的简单自定义控件,您可以显示您的网页最后修改的日期/时间(例如,在我上面的网页页脚中)。显示修改日期可以给您的访问者一个关于页面信息时效性的概念。
此项目还可作为创建简单自定义控件的示例。该控件可以直接放入 Visual Studio(或 Visual Web Developer)的工具箱中,可以在设计时使用,也可以非常简单地手动编辑到您的页面中。
将该控件包含在您的母版页中,将为您的所有网页添加“最后修改”日期/时间。
Using the Code
要使用 LastModified
控件,您只需在网页代码中包含它即可。
<Tek4:LastModified runat="server" />
以上仅生成日期和时间,因此,您可能希望提供某种标签和/或包含 <span>
或 <div>
以进行样式设置。
<span style="font-size:smaller;">
LastModified: <Tek4:LastModified runat="server" />
<span>
如果您想更改默认的 DateTime
格式字符串(见下文),请指定额外的 Format
属性。
<Tek4:LastModified runat="server" Format="g" />
此外,您必须将 Tek4.Web.UI.CustomControls.LastModified.dll 程序集复制到您的 Web 应用程序的 /bin 目录,或者将其安装到 GAC(全局程序集缓存)中。
最后,您需要在网页顶部注册该程序集。
<%@ Page %>
<%@ Register TagPrefix="Tek4"
Namespace="Tek4.Web.UI.CustomControls.LastModified"
Assembly="Tek4.Web.UI.CustomControls.LastModified,
Version=1.0.0.1, Culture=neutral, PublicKeyToken=26c804c56bafc725" %>
或者,您也可以选择将页面保持干净,而是在 web.config 文件中注册程序集。
<system.web>
<pages>
<controls>
<add tagprefix="Tek4"
assembly="Tek4.Web.UI.CustomControls.LastModified"
namespace="Tek4.Web.UI.CustomControls.LastModified,
Version=1.0.0.1, Culture=neutral,
PublicKeyToken=26c804c56bafc725" />
</controls>
</pages>
</system.web>
此项目随附的已编译程序集已用我的安全密钥安全签名,因此可以安装到 GAC。如果您重新编译项目,您将需要提供自己的安全密钥进行签名。
将 LastModified 自定义控件添加到您的工具箱
要将 LastModified
控件添加到您的 Visual Studio(或 Visual Web Developer)工具箱,只需打开包含 *.dll 程序集的文件窗口,然后将该程序集拖到工具箱中。

LastModified
控件会与其时钟图标一起添加到工具箱中。

现在,您可以在设计视图中双击或将 LastModified
控件拖到您的网页上。

这是 LastModified
控件的属性窗口。

LastModified
控件唯一独特的属性是 Format
属性,它是一个 string
,用于确定控件渲染时使用的日期/时间格式(见下文)。默认值为 'r
'。
DateTime 格式属性
日期/时间的输出格式由 Format
属性决定。Format
属性是一个标准的 .NET DateTime
格式字符串,分为两类。
标准 DateTime 格式字符串
标准 DateTime
格式字符串由一个单个字符格式说明符组成,代表一种自定义格式。例如:
d
- 短日期 (MM/dd/yyyy)D
- 长日期 (dddd, dd MMMM yyyy)f
- 完全日期/时间 (dddd, dd MMMM yyyy HH:mm)g
- 通用日期/时间 (MM/dd/yyyy HH:mm)r
- RFC1123 格式 (ddd, dd MMM yyyy HH':'mm':'ss 'GMT')
默认格式是 'r
',如果您不指定 Format
属性,则使用此格式。
请记住,如果您使用的是 标准 DateTime 格式字符串,实际显示的格式由 Web 服务器的当前区域设置决定,该区域设置在控制面板的区域和语言选项中设置。但区域设置不会影响默认的 RFC1123 格式。
自定义 DateTime 格式字符串
自定义 DateTime
格式字符串由一系列字符组成,允许您以任何您想要的方式显示日期和时间。例如:
- d MMMM - (12 April)
- dddd MMMM yy gg - (Thursday April 01 A.D.)
- hh:mm, G\MT zzz - (05:13 GMT -09:00)
有关如何制定您自己的格式,请参阅 MSDN 关于 DateTime 格式字符串的文档。
值得关注的点
实际代码非常简单。LastModified
类继承自 System.Web.UI.WebControls.WebControl
,后者是所有 WebControl
的基类。WebControl
本身只渲染为一对空的 <span>
标签。
<span></span>
LastModified
类重写了 WebControl
的一个方法:RenderContents()
方法。RenderContents()
方法负责控件开始和结束标签之间的所有内容——即将在 <span>
标签之间渲染的内容。
RenderContents()
会接收一个用于渲染的 HtmlTextWriter
对象。调用时,RenderContents()
会定义一个 DateTime
对象 dt
,该对象将接收最后修改的日期/时间。进入一个 try
块以防止异常,通过首先获取虚拟 Web 路径,然后使用 MapPathSecure()
将其转换为文件系统路径来检索当前 *.aspx 页面的文件路径。
protected override void RenderContents(HtmlTextWriter writer) {
DateTime dt;
try {
string filePath = MapPathSecure(Page.Request.CurrentExecutionFilePath);
dt = new FileInfo(filePath).LastWriteTime;
} catch { // "design-time" or current path doesn't resolve to a file
dt = DateTime.Now;
}
writer.Write("{0:" + Format + "}", dt);
}
要获取当前正在执行脚本的虚拟 Web 路径,我们访问当前页面的 Request
对象的 CurrentExecutionPath
属性。如果我们正在 Visual Studio 中设计时使用该控件,此操作将引发异常,因为没有 Request
对象。Request
对象的 CurrentExecutionPath
、Path
和 FilePath
属性之间存在细微差别——有关详细信息,请参阅 MSDN 文档——但要知道 CurrentExecutionPath
属性会返回实际执行脚本的虚拟路径,没有额外的尾部 string
。
使用文件路径构造的 FileInfo
对象会提供其 LastWriteTime
属性——也就是我们的“最后修改” DateTime
对象。在发生异常(例如在设计时)的情况下,catch
块会用当前日期/时间初始化 dt
。
最终的输出渲染只是使用 Format
属性指定的格式将内容写入 HtmlTextWriter
对象。
类属性
查看代码中的类声明会发现应用了许多属性。
[ AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
DefaultProperty("Format"),
ToolboxData("<{0}:LastModified runat="\""server\"/>") ]
public class LastModified : WebControl {
简而言之,AspNetHostingPermission
属性要求代码在 ASP.NET 托管环境中执行所需的最低信任级别。另外两个属性是为 Visual Studio 的设计时准备的。DefaultProperty
指定唯一属性 Format
是设计时使用的默认属性。ToolboxData
属性指定 Visual Studio 默认插入的网页代码。
Format 属性
此属性允许获取和设置日期/时间输出的格式。格式字符串存储在控件的 ViewState
中。如果未设置任何值,则返回默认值 'r
'。多个属性指定了 Visual Studio 的设计时属性。
[ Bindable(true),
Category("Appearance"),
DefaultValue("r"),
Description("A DateTime format specifier.") ]
public virtual string Format {
get {
string s = (string)ViewState["Format"];
return (s == null) ? "r" : s;
}
set {
ViewState["Format"] = value;
}
}
历史
- 2007-02-11 v.1.0.0.0 - 原始发布
- 2009-04-05 v.1.0.0.1 - 添加了
AllowPartiallyTrustedCallers
属性