比较两个日期的问题

时间:2011-05-18 12:25:53

标签: asp.net ajax validation calendarextender

我使用两个CalendarExtender来合并两个日期:开始日期结束日期,我使用compare validator来验证结束日期大于开始日期。

即使整个结束日期大于整个开始日期,验证者在结束日期的日期小于开始日期的日期时触发的问题。

如何解决这个问题?

我的aspx:

1 - 开始日期:

<asp:TextBox ID="txt_startDate" runat="server" ValidationGroup="insertgroup" MaxLength="10"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txt_startDate"
    ErrorMessage="!" ValidationGroup="insertgroup"></asp:RequiredFieldValidator>
<cc1:MaskedEditExtender ID="txt_startDate_MaskedEditExtender" runat="server" CultureAMPMPlaceholder=""
    CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder=""
    CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""
    Enabled="True" Mask="99/99/9999" MaskType="Date" TargetControlID="txt_startDate">
</cc1:MaskedEditExtender>
<cc1:CalendarExtender ID="txt_startDate_CalendarExtender" runat="server" Enabled="True"
    TargetControlID="txt_startDate" Format="dd/MM/yyyy">
</cc1:CalendarExtender>

2-end date:

<asp:TextBox ID="txt_endDate" runat="server" ValidationGroup="insertgroup" MaxLength="10"></asp:TextBox>
<cc1:CalendarExtender ID="txt_endDate_CalendarExtender" runat="server" TargetControlID="txt_endDate"
    Format="dd/MM/yyyy">
</cc1:CalendarExtender>
<cc1:MaskedEditExtender ID="txt_endDate_MaskedEditExtender" runat="server" CultureAMPMPlaceholder=""
    CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder=""
    CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""
    Enabled="True" Mask="99/99/9999" MaskType="Date" TargetControlID="txt_endDate">
</cc1:MaskedEditExtender>
<asp:RequiredFieldValidator ID="RequiredFieldValidator10" runat="server" ControlToValidate="txt_endDate"
    Display="Dynamic" ErrorMessage="!" ValidationGroup="insertgroup"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="CompareValidator2" runat="server" ControlToCompare="txt_startDate"
    ControlToValidate="txt_endDate" Display="Dynamic" ErrorMessage="????? ??????? ??? ?? ???? ??? ?? ????? ???????"
    Operator="GreaterThan" Type="Date" ValidationGroup="insertgroup"></asp:CompareValidator>

修改 两个日期的示例会产生问题:

//error message
    start date: 
    28/01/2014

    end date :
    25/07/2014

// no error message
    start date: 
    28/01/2014

    end date :
    01/07/2014

2 个答案:

答案 0 :(得分:4)

以下是有关您为什么会遇到这种行为的更多信息,以及为什么Chad的代码会对您有所帮助。

现在您的应用程序在文化设置下运行,该日期应该是mm / dd / yyyy(您的计算机或网络服务器像美国人一样工作)。如果你查看ASP.NET为验证器发出的javascript,你会看到在进行比较时首先检查ControlToValidate的数据类型是否正确。它通过使用RegEx解析输入的值来完成此操作,并期望月值为先,然后是当天(由于文化设置)。当它看到你的价值25时,它认为这不是一个有效的月份,因此说你的日期无效。然后返回false,甚至不检查第二个字段的日期值或尝试比较它们。

在第二个示例中,验证通过,因为首先,它检查结束日期的数据类型,该日期可以是有效的mm / dd / yyyy日期。然后它检查第二个日期的数据类型,由于28,它使它认为它不是一个有效的日期。然后验证器返回true,因为它假定有效日期大于无效日期。

Chad的代码会将页面线程的文化设置为使用dd / MM / yyyy格式的文本,因此验证者在检查日期是否有效时会使用该文件。

以下是the MSDN page,其中包含有关文化设置及其功能的更多信息。

答案 1 :(得分:2)

尝试将此加载​​到

背后的代码中的页面加载中
System.Globalization.CultureInfo vCulture = (System.Globalization.CultureInfo)System.Globalization.CultureInfo.CreateSpecificCulture("en-GB").Clone(); 
vCulture.DateTimeFormat.ShortDatePattern = "dd/mm/yyyy";    
System.Threading.Thread.CurrentThread.CurrentCulture = vCulture;