1

我正在尝试使用验证器组件,但我在夏令时遇到问题。

这一切都始于一个干净的新网站项目的简单标记:

<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 构建的更大的系统。

为了清楚起见,这里有两个调试器屏幕:

http://img692.imageshack.us/img692/2268/son0.png

http://img14.imageshack.us/img14/4963/dhbl.png

4

0 回答 0