2010-06-01 6 views
4

J'essaie d'utiliser LinkButtons avec la propriété DefaultButton du panneau ASP.NET dans un UpdatePanel. J'ai lu et utilisé les diverses autres réponses qui décrivent le câblage de l'événement click afin qu'une publication complète ne soit pas effectuée à la place d'une publication partielle. Lorsque la page se charge, je câble la fonction .click du LinkButton afin que la propriété DefaultButton du panneau ASP.NET fonctionne.Câblage des gestionnaires JavaScript après une publication partielle dans ASP.NET

Tout cela fonctionne très bien, jusqu'à ce que vous apportiez un UpdatePanel dans le mélange. Avec un UpdatePanel, s'il y a une publication partielle, le script pour câbler la fonction .click n'est pas appelé dans la publication partielle, et appuyer sur enter revient à provoquer une soumission complète du formulaire plutôt que de déclencher le LinkButton. Comment puis-je faire exécuter javascript après une publication partielle pour re-câbler la fonction .click du LinkButton?

J'ai créé un exemple de page qui montre le problème. Il y a deux alertes montrant 1) Quand le code pour raccorder la fonction .click est appelé, et 2) Quand la fonction .click a été appelée (ceci se produit seulement quand vous frappez enter dans la zone de texte après que l'événement a été câblé). Pour tester ce code, tapez quelque chose dans la zone de texte et appuyez sur Entrée. Le texte sera copié dans le contrôle d'étiquette, mais l'alerte "Câblage d'un clic d'événement" ne s'affichera pas. Ajoutez une autre lettre, appuyez de nouveau sur Entrée et vous obtiendrez une publication complète sans que le texte soit copié dans le contrôle d'étiquette (car le LinkButton n'a pas été appelé). Étant donné qu'il s'agissait d'une publication complète, l'événement Click de l'événement Wiring Up sera à nouveau appelé et le formulaire fonctionnera à nouveau correctement la prochaine fois.

Ceci est fait avec ASP.NET 3.5.

essai Code de cas:

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

Répondre

2

J'ai trouvé la solution à ce à la fin - je me sers ScriptManager.RegisterStartupScript au lieu de Page.ClientScript.RegisterStartupScript - cela fonctionne à l'intérieur UpdatePanel s.

Questions connexes