2010-06-01 1 views
4

Я пытаюсь использовать LinkButtons с свойством DefaultButton панели ASP.NET в UpdatePanel. Я прочитал и использовал различные другие ответы, которые описывают проводку события click, чтобы полная обратная передача не выполнялась вместо частичной обратной передачи. Когда страница загружается, я подключаю функцию .click к LinkButton, чтобы свойство DefaultButton панели ASP.NET работало.Проводка обработчиков JavaScript после частичного обратной передачи в ASP.NET

Все это прекрасно работает, пока вы не добавите UpdatePanel в микс. С UpdatePanel, если есть частичная обратная передача, сценарий для подключения функции .click не вызывается в частичной обратной передаче, а нажатие вводит возврат к вызову полного представления формы, а не к запуску LinkButton.

Как я могу заставить javascript выполнять после частичного обратной передачи, чтобы повторно подключить функцию .click LinkButton?

Я создал образец страницы, который показывает проблему. Есть два предупреждения, показывающие 1) Когда вы вызываете код для подключения функции .click и 2) Когда вызывалась функция .click (это происходит только тогда, когда вы нажимаете Enter в текстовом поле после того, как событие было подключено). Чтобы протестировать этот код, введите что-то в текстовое поле и нажмите Enter. Текст будет скопирован в элемент управления меткой, но предупреждение «Проводка событий» не будет отображаться. Добавьте еще одно письмо, нажмите Enter еще раз, и вы получите полную обратную передачу без копирования текста в элемент управления меткой (поскольку LinkButton не был вызван). Поскольку это была полная обратная передача, событие Click события Wiring Up Event будет вызываться снова, и форма снова будет работать правильно в следующий раз.

Это выполняется с помощью ASP.NET 3.5.

Test Case Код:

<%@ 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> 

ответ

2

Я нашел решение этой проблемы, в конце концов - я должен был с помощью ScriptManager.RegisterStartupScript вместо Page.ClientScript.RegisterStartupScript - это работает внутри UpdatePanel с.

 Смежные вопросы

  • Нет связанных вопросов^_^