1

我使用两个CalendarExtender来组合两个日期:开始日期结束日期,我使用 acompare 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 结束日期:

<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
4

2 回答 2

4

这里有一些关于你为什么会出现这种行为的更多信息,以及为什么 Chad 的代码会帮助你。

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

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

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

这是MSDN 页面,其中包含有关文化设置及其作用的更多信息。

于 2011-05-18T14:58:08.647 回答
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; 
于 2011-05-18T14:43:27.527 回答