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

日期验证器自定义 Web 控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (16投票s)

2003年1月28日

2分钟阅读

viewsIcon

182757

downloadIcon

1646

一个用于验证用户手动输入的日期的自定义 Web 控件。

引言

.NET 提供的验证器是检查和验证用户在 Web 表单中输入内容(在处理之前)的绝佳工具。不幸的是,缺少一些日常有用的验证器……虽然可以从网上获得一些帮助(你可以在网上找到 CheckBoxCheckBoxList 验证器),但仍然缺少一个能够完美验证用户手动输入的日期(即没有下拉框)的控件。使用 DateValidator 控件,填补了这一空白。用户可以在一个普通的文本框中输入日期,仅此而已:你无需担心验证他们的输入,唯一的条件是日期必须采用 dd/mm/yyyy 格式。下载源代码后,你必须创建一个项目,然后将源文件添加到项目中。现在你可以编译以获得 DLL。现在你可以将 Web 控件包含在你的项目中(也可以将其添加到工具箱),然后像往常一样注册控件。

<%@ Register TagPrefix="dgw" 
  Namespace="Doing.General.WebControls.Validators" 
  Assembly="Doing.WebControls" %>

然后选择要绑定的控件,就像绑定通常的验证器一样。

<asp:textbox id="txtBirth" runat="server" cssclass="TEXT1"/>
<dgw:datevalidator 
    id="dvBirth" 
    runat="server" 
    display="Dynamic" 
    controltovalidate="txtBirth" 
    errormessage="Date not valid"/>

事实上,该控件继承自 BaseValidator,因此你拥有所有你习惯的方法和属性。从技术角度来看,可能最有趣的是 ClientScript 函数,它用于构建执行客户端导航所需的 JavaScript 代码。

protected void ClientScript() {
    this.Attributes["evaluationfunction"] = "doingValidateDate";

    StringBuilder validatorScript = new StringBuilder();
    validatorScript.Append("<script language=\"javascript\">");
    validatorScript.Append("\r");
    validatorScript.Append("function doingValidateDate(val) {");
    validatorScript.Append("\r");
    validatorScript.Append("var oDate = 
            document.all[val.controltovalidate];");
    validatorScript.Append("\r");
    validatorScript.Append("var sDate = oDate.value;");
    validatorScript.Append("if (sDate == \"\") return true;");
    validatorScript.Append("\r");
    validatorScript.Append("var iDay, iMonth, iYear;");
    validatorScript.Append("\r");
    validatorScript.Append("var arrValues;");
    validatorScript.Append("\r");
    validatorScript.Append("var today = new Date();");
    validatorScript.Append("\r");
    validatorScript.Append("arrValues = sDate.split(\"/\");");
    validatorScript.Append("\r");
    validatorScript.Append("iDay = arrValues[0];");
    validatorScript.Append("\r");
    validatorScript.Append("iMonth = arrValues[1];");
    validatorScript.Append("\r");
    validatorScript.Append("iYear = arrValues[2];");
    validatorScript.Append("\r");
    validatorScript.Append
      ("if ((iMonth == null) || 
      (iYear == null)) return false;");
    validatorScript.Append("\r");
    validatorScript.Append
      ("if ((iDay > 31) || (iMonth > 12) 
      || (iYear < 1900 || 
      iYear > today.getFullYear())) return false;");
    validatorScript.Append("\r");
    validatorScript.Append
      ("var dummyDate = new Date(iYear, iMonth - 1, iDay);");
    validatorScript.Append("\r");
    validatorScript.Append
      ("if ((dummyDate.getDate() != iDay) || 
      (dummyDate.getMonth() != iMonth - 1) || 
      (dummyDate.getFullYear() != iYear)) return false;");
    validatorScript.Append("\r");
    validatorScript.Append("return true;");
    validatorScript.Append("\r");
    validatorScript.Append("}");
    validatorScript.Append("\r");
    validatorScript.Append("</script>");
    this.Page.RegisterClientScriptBlock
      ("doingValidateDate", validatorScript.ToString());
}

编译并处理后,该函数会生成以下 JavaScript 代码。

<script language="javascript">
function doingValidateDate(val) {
    var oDate = document.all[val.controltovalidate];
    var sDate = oDate.value;
    if (sDate == "") return true;
    var iDay, iMonth, iYear;
    var arrValues;
    var today = new Date();
    arrValues = sDate.split("/");
    iDay = arrValues[0];
    iMonth = arrValues[1];
    iYear = arrValues[2];
    if ((iMonth == null) || (iYear == null)) return false;
    if ((iDay > 31) || (iMonth > 12) || 
        (iYear < 1900 || iYear > today.getFullYear())) 
      return false;
    var dummyDate = new Date(iYear, iMonth - 1, iDay);
    if ((dummyDate.getDate() != iDay) || 
      (dummyDate.getMonth() != iMonth - 1) || 
      (dummyDate.getFullYear() != iYear)) 
         return false;
    return true;
}
</script>

改进

当然,这个验证器还可以进行很多改进。最有用的功能可能是能够检查日期是否在有效范围内,以及支持更多日期格式(例如:mm/dd/yyyyyyyy/mm/dd)。

问候

我必须感谢 Donny Mack 编写了一个精彩的 教程 [^],它帮助我理解并构建了这个 Web 用户控件。

© . All rights reserved.