jQuery datepicker ms ajax updatepanel не работает после отправки назад

поэтому я сделал некоторое чтение связанных вопросов и имел некоторые интересные вещи, но не нашел ответа, по крайней мере, не понял ответа.

Я очень новичок в AJAX, javascript и sclient стороне сценариев в целом.

Я использую C# asp.net немного и недавно добавил некоторые updatepanels на мою сторону, чтобы сгладить так пользовательских элементов управления и битов обновляется, чтобы страница не перезагружалась каждый раз. Все работает блестяще, и я был очень счастлив с ним, пока я не решил попробовать использовать jQuery.

Я взял datepicker из пользовательского интерфейса.на jQuery.js, который классный и отлично работает на обычной странице. Моя проблема возникает, когда я делаю обратную передачу из updatepanel. Элемент datepicker просто перестает работать.

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

1) я действительно не понимаю, почему. на моей главной странице у меня есть:

<script type="text/javascript">
    $(function() {
        $(".mydatepickerclass").datepicker({dateFormat: 'dd-mm-yy'});
    });
</script>

который поднимает мой вход коробки с назначенным mydatepickerclass. и все работает. Почему это перестало работать на postback.

2) Как это исправить.... как подключить его так, чтобы после обратной передачи в updatepanel он все еще работал.

Я понимаю, что идентификатор может измениться на обратной передаче, я думаю, но, поскольку я использую классы, я не знаю, что происходит не так.

редактировать

у меня есть следующий код в моем usercontrol, где обновление происходит:

<asp:UpdatePanel ID="HistoryUpdatePanel" runat="server">
<ContentTemplate>
    <%-- Start of Company History section --%>
    <fieldset>
        <legend>Activity History</legend>

           <script type="text/javascript">
              $(function() {
              $(".mydatepickerclass").datepicker({dateFormat: 'dd-mm-yy'});
              });
           </script>            

        <div>
            <asp:ListBox ID="listBoxHistoryTypes" runat="server" SelectionMode="Multiple" AutoPostBack="true" OnSelectedIndexChanged="listBoxHistoryTypes_IndexChanged" />
            <label>Date From:</label><asp:TextBox class="mydatepickerclass" ID="txtdatefrom" runat="server" />
            <label>Date To:</label><input class="mydatepickerclass" type="text" />
            <asp:TextBox class="mydatepickerclass" ID="txtdateto" runat="server" />
            <asp:Button ID="btnFilterSearch" runat="server" Text="Filter Results" OnClick="btnFilterSearch_Click" />
        </div>


    </fieldset>
</ContentTemplate>

сценарий внутри updatepanel не перепрограммирует его?

спасибо

Джон Хокинс

8 ответов


панель обновления собирается перезагрузить содержимое html. Вам нужно будет прослушать UpdatePanel для завершения и воссоздания datepicker.

вот очень простой пример. Это не учитывает несколько панелей обновления на Вашей странице или потенциальные утечки памяти от неправильного уничтожения вашего datepicker.

еще одна вещь, которую нужно отметить при смешивании ASP.NET Ajax и jQuery будьте осторожны, потому что оба используют $ в разных контексты

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.1.js">
    </script>
    <script type="text/javascript">
        $(document).ready(function() {
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

            function EndRequestHandler(sender, args) {
                $('.mydatepickerclass').datepicker({ dateFormat: 'dd-mm-yy' });
            }

        });
    </script>   
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:TextBox ID="TextBox1" runat="server" CssClass="mydatepickerclass"></asp:TextBox>
            <br />
            <asp:Button ID="Button1" runat="server" Text="UpdateMe" 
                onclick="Button1_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>

Я знаю, что это старый, но ... попробуйте заменить:

$(document).ready(function() {

С:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () {


вместо этого есть простая альтернатива.

в postback элемента в панели обновления, добавьте этот код

ScriptManager.RegisterStartupScript(Me, Me.GetType(), "asddas", "getjquerydate();",   True)

и это в javascript

function getjquerydate() {

$(".datepicker").datepicker({
    numberOfMonths: 2,
    showButtonPanel: true,
    minDate: 1,
    dateFormat: 'dd/mm/yy',
    showOn: "button",
    buttonImage: "images/calendar.gif",
    buttonImageOnly: true
});

}

после частичной обратной передачи в обновленной панели он снова вызывает функцию datepicker


$(document).ready(function () {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
        Sys.WebForms.PageRequestManager.getInstance().beginAsyncPostBack();
        function EndRequestHandler(sender, args) {
            $('.mydatepickerclass').datepicker({ dateFormat: 'dd-mm-yy' });
        }
    });

вы можете сделать такой. в этом случае он будет работать всегда ;))


"jQuery UI Datepicker не работает после частичной обратной передачи ajax"

поместите на страницу диспетчер сценариев и панель обновления.

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="upd1" runat="server">
 <ContentTemplate>
 </ContentTemplate>
</asp:UpdatePanel>

Теперь поместите текстовое поле и кнопку, внутри элемента управления UpdatePanel.

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="upd1" runat="server">
 <ContentTemplate>
     <div style="font-family: Arial; font-size: small;">
        Select Date :
        <asp:TextBox ID="txtDate" runat="server"Font- Names="Arial">           
        </asp:TextBox>
     </div>
     <asp:Button ID="btnAjax" runat="server" Text="Ajax PostBack"  
       OnClick="btnAjax_Click" />
  </ContentTemplate>
</asp:UpdatePanel>

теперь свяжите элемент управления datepicker с текстовым полем.

<script type="text/javascript" language="javascript">
$(document).ready(function(){     
    $("#<%=txtDate.ClientID %>").datepicker(
    {   changeMonth:true,
        changeYear:true,
        showOn: 'button',
        buttonText:'Show Date',
        showAnim: 'fadeIn',
        showButtonPanel: true,
        dateFormat: 'DD, MM d, yy',
        buttonImage: 'Images/imgCalendar.png',
        buttonImageOnly: true
     }
   );
   $(".ui-datepicker-trigger").mouseover(function() {
        $(this).css('cursor', 'pointer');
   });
}); 
<script>

Теперь создайте щелчок на стороне сервера для кнопки, которая вызовет частичную обратную передачу ajax.

protected void btnAjax_Click(object sender, EventArgs e)
{
   System.Threading.Thread.Sleep(1000);
}

на странице, u бы увидеть что-то вроде этого

Ajax PostBack

нажмите на datepicker. Datepicker открывается, и выбранная дата становится значением текстового поля. Теперь нажмите на кнопку. Кнопка на стороне сервера нажимается, и теперь вы увидите что-то вроде этого.

AJAX Postback2

кнопка datepicker исчезла.Итак, что мы делаем сейчас, чтобы заставить его работать в ajax. Увидеть ниже код.

<script type="text/javascript" language="javascript">
function pageLoad(sender, args)
{
  $(document).ready(function(){     
    $("#<%=txtDate.ClientID %>").datepicker(
    {   changeMonth:true,
        changeYear:true,
        showOn: 'button',
        buttonText:'Show Date',
        showAnim: 'fadeIn',
        showButtonPanel: true,
        dateFormat: 'DD, MM d, yy',
        buttonImage: 'Images/imgCalendar.png',
        buttonImageOnly: true
     }
   );
   $(".ui-datepicker-trigger").mouseover(function() {
        $(this).css('cursor', 'pointer');
   });
  }); 
}
</script>

функция pageLoad() доступна в JavaScript, если вы используете ASP.NET Аякс. AJAX framework автоматически подключает любую клиентскую функцию с именем pageLoad () в качестве приложения.Обработчик нагрузки

Исходная Ссылка Кредиты

http://www.jquerybyexample.net/2010/08/jquery-datepicker-does-not-work-after.html


Sys.Application.add_load(LoadHandler);

//This load handler solved update panel did not bind date picker after partial postback 
function LoadHandler() {
    $(document).ready(function () {
        $(".datepicker").datepicker({
            dateFormat: "M d, yy",
            changeMonth: true,
            changeYear: true,
            onSelect: function (dateText, ubst) { your code here... }
        }).val();
    });
}

Я знаю, что это старый пост, но я просто сталкиваюсь с этой проблемой и нашел ответ в этой теме. Надеюсь, это поможет любому, кто столкнется с этим.

Я не помещал скрипт на стороне клиента в код позади. Я только поставил этот код:

       <script type="text/javascript">       
         Sys.WebForms.PageRequestManager.getInstance().add_pageL
              Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

              function EndRequestHandler() {
                  $('.default-date-picker').datepicker({
                      format: 'dd-mm-yyyy'
                  });
              }

             });
             </script>  

код выше должен быть внутри секции тела, а не в головной секции. Я попытался поместить его до и после диспетчера сценариев или внутри и снаружи UpdatePanel и не нашел проблем со всеми параметрами. Так долго поскольку этот код находится в разделе body, он работает для меня.

просто убедитесь, что вы изменили свой определенный класс datetimepicker. Для меня это "выбор даты по умолчанию" в файле js.


Я знаю, что этот пост старый, но просто поместите свой jQuery datepicker вне панели обновления-должен работать на 100%...