65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义控件在网页上显示“最后修改”日期/时间

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.40/5 (2投票s)

2007年2月11日

CPOL

5分钟阅读

viewsIcon

51222

downloadIcon

416

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

为您的网页添加“最后修改”日期/时间

Sample image

引言

使用这里提供的简单自定义控件,您可以显示您的网页最后修改的日期/时间(例如,在我上面的网页页脚中)。显示修改日期可以给您的访问者一个关于页面信息时效性的概念。

此项目还可作为创建简单自定义控件的示例。该控件可以直接放入 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 对象的 CurrentExecutionPathPathFilePath 属性之间存在细微差别——有关详细信息,请参阅 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 属性
© . All rights reserved.