проблема в сравнении двух дат - PullRequest
1 голос
/ 18 мая 2011

я использую два 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-дата окончания:

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

EDIT: Пример для двух дат делает проблемы:

//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 ]

4 голосов
/ 18 мая 2011

Вот еще некоторая информация о том, почему вы получаете такое поведение, и почему код Чада поможет вам.

В настоящее время ваше приложение работает с настройкой культуры, которая говорит, что даты должны быть мм / дд /гггг (ваш компьютер или веб-сервер работает как американец).Если вы посмотрите на JavaScript, который ASP.NET генерирует для валидаторов, вы увидите, что при сравнении он сначала проверяет, является ли тип данных ControlToValidate корректным.Он делает это путем синтаксического анализа введенного значения с помощью RegEx и ожидает, что значение месяца будет первым, а затем днем ​​(из-за настройки культуры).Когда он видит ваше значение 25, он не считает его действительным месяцем и, следовательно, говорит, что ваша дата недействительна.Затем он возвращает false, даже не проверяя значение даты во втором поле и не пытаясь сравнить их.

Во втором примере проверка проходит успешно, потому что сначала она проверяет тип данных даты окончания, которая МОЖЕТ быть допустимой мм./ дд / гггг дата.Затем он проверяет тип данных второй даты, который из-за 28 заставляет его думать, что это недопустимая дата.Затем валидатор возвращает истину, поскольку предполагает, что действительная дата больше недействительной.

Код Чада установит в культуре потока вашей страницы тот, который использует формат dd / MM / yyyy,и, следовательно, ваши валидаторы будут использовать это при проверке правильности ваших дат.

Вот страница MSDN с дополнительной информацией о настройках культуры и о том, что они делают.

2 голосов
/ 18 мая 2011

Попробуйте поместить это в загрузку страницы в коде

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; 
...