Я попытался завершить свою проблему приведенным ниже полным примером - исходная проблема является частью плагина 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>