Page_load запускается дважды для обновления UpdatePanel, при этом в раскрывающемся списке присутствует событие изменения, связанное с jQuery. - PullRequest
1 голос
/ 12 сентября 2010

Я попытался завершить свою проблему приведенным ниже полным примером - исходная проблема является частью плагина jQuery, который я пишу, чтобы расширить поведение уже существующего приложения ajax ASP.NET.

На странице aspx ниже есть один выпадающий список, который помечен для автоматической обратной отправки.Я также связал событие изменения с помощью jquery (который в конечном итоге я заменим на событие .live () для поддержания привязки после обновления панели обновления.) Проблема в том, что когда событие jQuery связано, я вижу два запроса начала ajaxи page_loads запускаются, но только одно событие ddlTest_OnselectedIndexChanged.Одна из загрузок страницы также искажена - длина содержимого указывает, что ее длина составляет около 300 байтов, а totalBytes равно 0 и данные формы пустые.Этого не произойдет, если я свяжусь с событием нажатия кнопки.

Может кто-нибудь объяснить, почему запускается ошибочное событие page_load, пожалуйста?

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Diagnostics" %>
<!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">
    <script runat="server">
      private void Page_Load(object sender, EventArgs e)
      {
          Debug.WriteLine(Request.Headers["Content-Length"]);
          Debug.WriteLine(Request.TotalBytes);
          Debug.WriteLine(Request.Form.ToString());
          Debugger.Break();
      }
      private void ddlTest_OnSelectedIndexChanged(object sender, EventArgs e)
      {
          Debugger.Break();
      }
    </script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function() {
            Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequestHandler);
            $("#<%=ddlTest.ClientID%>").change(function() { alert('jQuery binding fired'); });
        });
        function beginRequestHandler() {
            alert("Started ajax call");
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="SciptManager" runat="server" />
        <asp:UpdatePanel ID="updTest" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlTest_OnSelectedIndexChanged" >
                    <asp:ListItem>First</asp:ListItem>
                    <asp:ListItem>Second</asp:ListItem>
                </asp:DropDownList>
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

Обновление: я сузилпроблема вниз еще дальше.Firefox и Chrome работают, как я и ожидал, в то время как у IE возникла проблема.Я также упростил ошибочный код в приведенном ниже примере.Трудно поверить, что это так просто, но метод jQuery .change () в выпадающем списке дважды вызывает событие onchange в элементе select!Я поищу других людей, у которых была эта проблема, и сообщу о моих результатах!

<%@ Page Language="C#" AutoEventWireup="true"%>
<!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">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function() {
            $('#ddlTest').change(function() { alert('jQuery event fired'); });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:DropDownList id="ddlTest" runat="server" onchange="alert('element event');">
            <asp:ListItem Text="First" />
            <asp:ListItem Text="Second" />
        </asp:DropDownList>
    </form>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 12 сентября 2010

Похоже, я обнаружил ошибку в последней версии jQuery :(. Если я верну тест обратно на версию 1.3.2, он будет работать нормально! Я также нашел ссылку на ошибку поднято с помощью jQuery.

0 голосов
/ 20 октября 2012

Вынуть autopostback = true = он запускает одну обратную передачу, а событие изменения - другую.

0 голосов
/ 12 сентября 2010

Вызов $ ("# <% = ddlTest.ClientID%>"). Change (... , вероятно, вызывает ваш выпадающий список, и из-за вашего autopostBack вы получаете второе обновлениевашей страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...