Использование CompareValidator и CalenderExtender с неподдерживаемым форматом даты

У меня есть поле даты начала и окончания в форме. Я указал формат для расширителя календаря. с тех пор валидатор сравнения не работает. Он всегда отображает сообщение об ошибке. Пожалуйста помоги. Мне нужно показать дату в формате «Пт, 04 мая 2012 года».

Поле даты начала:

<asp:TextBox ID="txtStartDate" ReadOnly="true" runat="server" 
    CssClass="textBoxWidth TPRValue" Text='<%#DataBinder.Eval(Container.DataItem, "StartDate", "{0: ddd MM dd, yyyy}")%>'>
</asp:TextBox>
<asp:ImageButton ID="imgBtnStartDate" runat="server" ImageUrl="~/Common/Images/Calendar.GIF" CausesValidation="false" ImageAlign="AbsMiddle" />
<ajax:CalendarExtender ID="StartDateCalendar" TargetControlID="txtStartDate" PopupButtonID="imgBtnStartDate" runat="server" 
    Format="ddd MM dd, yyyy">
</ajax:CalendarExtender>
<asp:CompareValidator ID="startDateCompareValidator" runat="server" ControlToValidate="txtStartDate" ControlToCompare="txtEndDate" Enabled="true" 
    Type="Date" Display="Dynamic" Operator="LessThanEqual"
    Text="Startdate should be <= enddate">
</asp:CompareValidator>

Поле Дата окончания:

<asp:TextBox ID="txtEndDate" ReadOnly="true" runat="server" 
    CssClass="textBoxWidth TPRValue" Text='<%#DataBinder.Eval(Container.DataItem, "EndDate", "{0: ddd MM dd, yyyy}")%>'>
</asp:TextBox>
<asp:ImageButton ID="imgBtnEndDate" runat="server" ImageUrl="~/Common/Images/Calendar.GIF" CausesValidation="false" ImageAlign="AbsMiddle" />
<ajax:CalendarExtender ID="EndDateCalendar" TargetControlID="txtEndDate" PopupButtonID="imgBtnEndDate" runat="server" 
    Format="ddd MM dd, yyyy">
</ajax:CalendarExtender>

Сравните валидатор:

<asp:CompareValidator ID="startDateCompareValidator" runat="server" ControlToValidate="txtStartDate" 
    ControlToCompare="txtEndDate" Enabled="true" Type="Date" Display="Dynamic" Operator="LessThanEqual"
    Text="Startdate should be <= enddate">
</asp:CompareValidator>

person user1107973    schedule 16.03.2012    source источник


Ответы (3)


Я предполагаю, что CompareValidator не принимает ваш формат.

CompareValidator довольно требователен к датам, которые он принимает. Например, следующие даты не считаются действительными:

  • 1 января 2001 г.
  • 1 января 2001 г.
  • Пт, 04 мая 2012 г.

CompareValidator требует дату, которая выглядит следующим образом:

  • 1/1/2001
  • 1-1-2001
  • 5/4/2012

http://www.informit.com/articles/article.aspx?p=25461&seqNum=5

Не проверив его, вы можете попробовать использовать скрытый TextBox (display:none) с принятым форматом даты в качестве текста. Затем установите ControlToValidate Валидатора в «скрытое поле». Вам необходимо синхронизировать свойства Text обоих TextBox с их скрытыми полями. Может быть, это дает вам идею.

Редактировать: Хорошо, я попытался заставить это работать, как я сказал, и на самом деле это работает :) Возможно, возможен некоторый рефакторинг, но посмотрите сами.

Чтобы скрыть TextBox с рабочим форматом даты, я использовал CSS:

<style type="text/css">
    .hidden
    {
        display:none;   
    }
</style>

Эти JS-функции вызываются, когда пользователь меняет дату через CalendarExtenders:

<script type="text/javascript">
    function dateChangedStart(sender, args) {
        var selectedDate = sender.get_selectedDate();
        var hiddenStart = $get("txtStartDateHidden");
        var validator = $get("startDateCompareValidator");
        hiddenStart.value = dateToString(selectedDate);
        ValidatorValidate(validator);
    }
    function dateChangedEnd(sender, args) {
        var selectedDate = sender.get_selectedDate();
        var hiddenEnd = $get("txtEndDateHidden");
        var validator = $get("startDateCompareValidator");
        hiddenEnd.value = dateToString(selectedDate);
        ValidatorValidate(validator);
    }
    function dateToString(d) {
        var year = d.getFullYear();
        var month = d.getMonth() + 1; //months are zero based
        var day = d.getDate();
        return year + "/" + month + "/" + day;
    }
</script>

Это остальная часть образца страницы:

<div>
    <asp:TextBox ID="txtStartDate" CausesValidation="false" ReadOnly="true" runat="server">
    </asp:TextBox>
    <asp:TextBox ID="txtStartDateHidden" CssClass="hidden" ValidationGroup="DateCheck" CausesValidation="true" ReadOnly="false" runat="server">
    </asp:TextBox>
    <ajax:CalendarExtender ID="StartDateCalendar" TargetControlID="txtStartDate" runat="server"
        OnClientDateSelectionChanged="dateChangedStart"
        Format="ddd MM dd, yyyy">
    </ajax:CalendarExtender>
    <asp:CompareValidator ID="startDateCompareValidator" runat="server" EnableClientScript="true"
        ControlToValidate="txtStartDateHidden" Display="Static" Operator="LessThanEqual" ValidationGroup="DateCheck"
        ControlToCompare="txtEndDateHidden" Enabled="true" Type="Date" Text="Startdate should be <= enddate">
    </asp:CompareValidator>
    <asp:TextBox ID="TxtEndDate" CausesValidation="false" ReadOnly="true" runat="server">
    </asp:TextBox>
    <asp:TextBox ID="txtEndDateHidden" CssClass="hidden" ValidationGroup="DateCheck" CausesValidation="true" ReadOnly="false" runat="server">
    </asp:TextBox>
    <ajax:CalendarExtender ID="EndDateCalendar" TargetControlID="txtEndDate" runat="server"
        OnClientDateSelectionChanged="dateChangedEnd"
        Format="ddd MM dd, yyyy">
    </ajax:CalendarExtender>
    <asp:Button ID="BtnSubmit" CausesValidation="true" ValidationGroup="DateCheck" runat="server" Text="Submit" />
</div>
person Tim Schmelter    schedule 16.03.2012
comment
как синхронизировать со скрытым полем и текстовым полем? как только пользователь выбирает дату из управления календарем, она должна быть назначена как текстовому полю, так и скрытому полю.. нужно попробовать javascript - person user1107973; 16.03.2012
comment
@user1107973 user1107973: Я пытался продемонстрировать, и это, по-видимому, работает, взгляните на мой отредактированный ответ. - person Tim Schmelter; 16.03.2012
comment
@TimSchmelter Я пытаюсь заставить приведенный выше код работать на моей веб-странице, но я не думаю, что вы вообще запускаете код javascript. Разве OnClientDateSelectionChanged=dateChangedStart не должен быть OnClientDateSelectionChanged=dateChangedStart(), но с некоторыми параметрами, ожидаемыми javascript? - person Fandango68; 01.09.2014
comment
А также не следует запускать валидатор в дату END, поскольку дата окончания не всегда может быть указана раньше даты START. Я просто не понимаю, как вы утверждаете, что вышеизложенное работает. - person Fandango68; 01.09.2014
comment
@ Fernando68: я не понимаю твоего возражения. Это было давно, и я не могу проверить это сейчас, но я использую событие CalendarExtenders OnClientDateSelectionChanged. Календарь StartDateCalendar запускает dateChangedStart, а EndDateCalendar запускает dateChangedEnd. Я предоставил полный рабочий образец страницы. - person Tim Schmelter; 01.09.2014
comment
@TimSchmelter Привет, Тим. Я хочу сказать, что [1] ваше решение не работает, и [2] по логике оно должно применяться к дате КОНЕЦ, а не к дате начала, и [3] пока я нахожусь, что, если пользователь хочет ввести дату напрямую в текстовое поле? - person Fandango68; 02.09.2014
comment
@Fernando: я все еще не могу это проверить, но, насколько я вижу, вы должны проверить в обоих случаях, поэтому, если пользователь изменит дату первого и второго календаря, поскольку дата начала также может быть позже, чем дата окончания после пользователь изменил его. Если пользователю разрешено изменять его также в текстовом поле, вам просто нужно вызвать приведенный выше код в соответствующем событии, но вы также можете предотвратить это. В любом случае, это не было частью этого вопроса. - person Tim Schmelter; 02.09.2014
comment
@ Тим Шмелтер. Не могли бы вы предоставить нам полный образец того, что, как вы утверждаете, работает в соответствии с вашей строкой выше, хорошо, я пытался заставить его работать, как я сказал, и на самом деле это работает. Я не являюсь гуру Javascript ни в каком смысле, поэтому мне действительно поможет, если вы действительно сможете заставить свой ответ работать, особенно теперь, когда вы сказали ... Я все еще не могу его проверить. - person Fandango68; 02.09.2014
comment
@ Fernando68: я думаю, вы даже не пробовали код выше. Я предоставил рабочий пример страницы выше, добавил функции ASPX, CSS и JS. Я только что заметил, что даже сделал TextBoxes только для чтения, установив ReadOnly="true", чтобы пользователь не мог изменить его вручную, поэтому, очевидно, вы даже этого не заметили. РЕДАКТИРОВАТЬ Итак, я еще раз протестировал его, и он работает. Вы заметите, что вы не можете выбрать дату начала, которая раньше даты окончания, используя настраиваемый формат даты и времени, который обычно не поддерживается CompareValidator (что является основной темой этого вопроса). - person Tim Schmelter; 02.09.2014

В дополнение к ответу Тима для тех, кто хочет использовать jQuery:

function dateChangedStart(sender, args) {
    var selectedDate = sender.get_selectedDate();
    var hiddenStart = $('input[id$=txtStartDateHidden]');
    var validator = $('span[id$=startDateCompareValidator]');
    hiddenStart.val(dateToString(selectedDate));

    var validatorAsDOM = validator.get(0);
    ValidatorValidate(validatorAsDOM);
}
person Brabbeldas    schedule 26.03.2013
comment
Да, но вы пытались использовать ответ Тима в примере проекта или что-то в этом роде? Его код даже не вызывает код JS, так в чем же разница с jquery? - person Fandango68; 02.09.2014
comment
@ Fernando68: Вы не пробовали. Функции js запускаются, потому что они являются обработчиками событий, например: OnClientDateSelectionChanged="dateChangedStart". Вы вообще пользуетесь Ajax-CalendarExtenders? - person Tim Schmelter; 04.09.2014

Для формата даты ММ/дд/гггг

поместите это в Web.Config

<globalization culture="en-us"/> 

под

<system.web>
person Prateek Gupta    schedule 15.10.2014