我正在尝试使用验证器组件,但我在夏令时方面遇到了麻烦。
这一切都始于一个干净的新网站项目上的简单标记:
<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文件并将culture和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;
在我的机器上,使用2013,10和20作为参数的第一行上的Date对象的构造函数创建一个具有以下内容的对象: Sat Oct 19 23:00:00 UTC-0300 2013 。这意味着它尊重我的Windows配置,并且由于夏令时的开始而自动减1小时。因此,日期部分与原始部分不同,这使得验证失败,就像它是无效日期一样。
这是应该的方式吗?似乎验证器的Javascript并不像我想象的那样真实。
如何使用夏令时和验证器?
顺便说一句,我在Visual Studio 2010(以及所有可用的服务包)和.Net Framework 4.0上进行了此测试。
如果我使用的是Asp.Net MVC,我知道有几种方法可以解决这个问题,但这个例子属于使用WebForms构建的更大的系统。
为了清楚起见,这里有两个调试器屏幕: