日期验证器自定义 Web 控件






3.38/5 (16投票s)
2003年1月28日
2分钟阅读

182757

1646
一个用于验证用户手动输入的日期的自定义 Web 控件。
引言
.NET 提供的验证器是检查和验证用户在 Web 表单中输入内容(在处理之前)的绝佳工具。不幸的是,缺少一些日常有用的验证器……虽然可以从网上获得一些帮助(你可以在网上找到 CheckBox
和 CheckBoxList
验证器),但仍然缺少一个能够完美验证用户手动输入的日期(即没有下拉框)的控件。使用 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/yyyy 或 yyyy/mm/dd)。