我正在尝试使用验证器组件,但我在夏令时遇到问题。
这一切都始于一个干净的新网站项目的简单标记:
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RangeValidator ID="RangeValidatorTest" runat="server"
Type="Date" MinimumValue="17/09/2013" MaximumValue="12/11/2014"
ControlToValidate="TextBoxTest" ErrorMessage="Invalid Date">
</asp:RangeValidator>
</div>
</form>
我应该提到,写在这个问题上的所有日期都是“dd/MM/yyyy”。我编辑了 web.config 文件并将文化和 uiculture 设置为“pt-BR”并运行应用程序。
现在,使用这些设置,如果我尝试输入“20/10/2013”或“19/10/2014”,则表示它不是有效日期。
这些正是这些年份开始夏令时的日期。
如果我关闭开发机器上的选项以自动更改日期和时间,验证器将正常工作。
更进一步,我调试了验证器生成的客户端 javascript(文化和 uiculture 是在 web.config 上设置的——所以我希望相应地生成脚本)。错误发生在名为ValidatorConvert的函数中。这是导致问题的部分:
var date = new Date(year, month, day);
return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
在我的机器上,第一行的 Date 对象的构造函数以 2013、10 和 20 作为参数创建了一个对象,该对象具有以下内容:Sat Oct 19 23:00:00 UTC-0300 2013。这意味着它尊重我的 Windows 配置并由于夏令时的开始而自动减去 1 小时。因此,日期部分与原始日期部分不同,这使得验证失败,就好像它是无效日期一样。
这是它应该工作的方式吗?看起来验证器的 Javascript 并不像我想象的那样是动态的。
我如何使用夏令时和那些验证器?
顺便说一句,我在 Visual Studio 2010(以及所有可用的服务包)和 .Net Framework 4.0 上进行了此测试。
如果我使用的是 Asp.Net MVC,我知道有几种方法可以解决这个问题,但这个例子属于一个用 WebForms 构建的更大的系统。
为了清楚起见,这里有两个调试器屏幕: