Я пытаюсь использовать LinkButtons со свойством DefaultButton панели ASP.NET в UpdatePanel. Я прочитал и использовал различные другие ответы, описывающие связывание события click, так что полная обратная передача не выполняется вместо частичной обратной передачи. Когда страница загружается, я подключаю функцию .click к LinkButton, чтобы работало свойство DefaultButton панели ASP.NET.
Это все работает нормально, пока вы не добавите UpdatePanel в смесь. В UpdatePanel, если есть частичная обратная передача, сценарий для подключения функции .click не вызывается при частичной обратной передаче, и нажатие клавиши enter приводит к полной отправке формы, а не к запуску LinkButton.
Как я могу заставить javascript выполняться после частичной обратной передачи для повторного подключения функции .click LinkButton?
Я создал образец страницы, на которой показана проблема. Есть два предупреждения, показывающие 1) Когда вызывается код для подключения к функции .click, и 2) Когда вызывается функция .click (это происходит только при нажатии клавиши ввода в текстовом поле после того, как событие было подключено). ). Чтобы проверить этот код, введите что-нибудь в текстовое поле и нажмите Enter. Текст будет скопирован в элемент управления меткой, но предупреждение «Wiring up Event Click» не будет отображаться. Добавьте еще одну букву, нажмите Enter еще раз, и вы получите полный постбэк без копирования текста в элемент управления меткой (так как LinkButton не был вызван). Поскольку это была полная обратная передача, событие Click Wiring Up Event будет вызвано снова, и форма снова будет работать правильно в следующий раз.
Это делается с помощью ASP.NET 3.5.
Код тестового примера:
<%@ Page Language="C#" Inherits="System.Web.UI.Page" Theme="" EnableTheming="false" AutoEventWireup="true" %>
<script runat="server">
void cmdComplete_Click(object sender, EventArgs e)
{
lblOutput.Text = "Complete Pressed: " + txtInput.Text;
}
void cmdFirstButton_Click(object sender, EventArgs e)
{
lblOutput.Text = "First Button Pressed";
}
protected override void OnLoad(EventArgs e)
{
HookupButton(cmdComplete);
}
void HookupButton(LinkButton button)
{
// Use the click event of the LinkButton to trigger the postback (this is used by the .click code below)
button.OnClientClick = Page.ClientScript.GetPostBackEventReference(button, String.Empty);
// Wire up the .click event of the button to call the onclick function, and prevent a form submit
string clickString = string.Format(@"
alert('Wiring up click event');
document.getElementById('{0}').click = function() {{
alert('Default button pressed');
document.getElementById('{0}').onclick();
}};", button.ClientID, Page.ClientScript.GetPostBackEventReference(button, ""));
Page.ClientScript.RegisterStartupScript(button.GetType(), "click_hookup_" + button.ClientID, clickString, true);
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>DefaultButton/LinkButton Testing</title>
<style type="text/css">
a.Button { line-height: 2em; padding: 5px; border: solid 1px #CCC; background-color: #EEE; }
</style>
</head>
<body>
<h1>
DefaultButton/LinkButton Testing</h1>
<form runat="server">
<asp:ScriptManager runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div style="position: relative">
<fieldset>
<legend>Output</legend>
<asp:Label runat="server" ID="lblOutput" />
</fieldset>
<asp:Button runat="server" Text="First Button" ID="cmdFirstButton" OnClick="cmdFirstButton_Click" UseSubmitBehavior="false" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="cmdComplete">
<label>
Enter Text:</label>
<asp:TextBox runat="server" ID="txtInput" />
<asp:LinkButton runat="server" CssClass="Button" ID="cmdComplete" OnClick="cmdComplete_Click" Text="Complete" />
</asp:Panel>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button runat="server" ID="cmdFullPostback" Text="Full Postback" />
</form>
</body>
</html>