проблема в сравнении двух дат

я использую два CalendarExtender для объединения двух дат: дата начала и дата окончания, и я использую compare validator для проверки того, что дата окончания больше даты начала.

проблема, заключающаяся в том, что валидатор срабатывает, когда день в дате окончания меньше, чем день в дате начала, даже если вся дата окончания больше, чем вся дата начала..

как исправить эту проблему?

мой аспкс:

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

person Anyname Donotcare    schedule 18.05.2011    source источник
comment
Он отлично работает для меня. Я попробовал пример из этого сообщения weblogs.asp.net/sahannet/archive/2011/02/01/   -  person Bala R    schedule 18.05.2011
comment
Проблема в том, что вы сравниваете строки. Поэтому это будет сделано в алфавитном порядке, а не как тип данных даты.   -  person Duncan Howe    schedule 18.05.2011
comment
devx.com/dotnet/Article/6997   -  person Anyname Donotcare    schedule 18.05.2011


Ответы (2)


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

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

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

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

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

person patmortech    schedule 18.05.2011
comment
веб-сервер работает как американец, работает правильно: p - person Chad; 18.05.2011
comment
спасибо, но я получаю ту же ошибку. Я не понимаю, в чем проблема? Ваше объяснение настолько замечательное и логичное для меня, и я думал, что решу проблему, но все же после кода Чада я столкнулся с той же проблемой. - person Anyname Donotcare; 19.05.2011
comment
Наконец-то я понял большое спасибо. я поставил Culture="ar-EG" в директиву страницы, и это работает. - person Anyname Donotcare; 19.05.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; 
person Chad    schedule 18.05.2011