2010-10-05 16 views

risposta

33

Quindi so che tutti hanno mostrato l'approccio client di base, e va bene, ma volevo almeno mostrare una soluzione per gestire un evento lato client specifico sul server.

Consente di dare un'occhiata al codice e di esaminarlo pezzo per pezzo.

Poiché ASP.Net TextBox non espone un evento lato server per OnBlur, sarà necessario farlo manualmente. Fortunatamente questo è abbastanza facile da raggiungere. Supponiamo di avere questo piccolo pezzetto di codice nella tua pagina .aspx. Si desidera aggiornare un lato del server di controllo Label ogni volta che il TextBox perde lo stato attivo.

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br /> 
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br /> 
<asp:Label ID="lblOutput" runat="server" /> 

ASP.Net è dotato di un client side function che viene chiamato per innescare postback che prende due parametri:

  1. di destinazione (l'ID del controllo che causa l'evento)
  2. Argument (informazioni facoltative si desidera passare al server)

È potrebbe solo wireup l'evento nel markup per aggiungendo il seguente attributo e valore alla vostra TextBox:

onblur="__doPostBack('tbOnBlur','OnBlur');" 

Tuttavia, il quadro ha un modo semplice per generare questo script per voi lato server. Nel metodo Page_Init, è sufficiente aggiungere una chiamata a GetPostBackEventReference e assegnarlo al "onblur" attributo per controllare in questo modo:

protected void Page_Init(object sender, EventArgs e) 
{ 
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur"); 
    tbOnBlur.Attributes.Add("onblur", onBlurScript); 
} 

Con gli eventi di controllo del server standard, il wireup evento e l'invocazione è gestito automagicamente per voi da che implementa IPostBackEventHandler. È molto lavoro per una soluzione una tantum, quindi lascia che sia gestita manualmente ispezionando i parametri della richiesta.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     var ctrlName = Request.Params[Page.postEventSourceID]; 
     var args = Request.Params[Page.postEventArgumentID]; 

     HandleCustomPostbackEvent(ctrlName, args); 
    } 
} 

private void HandleCustomPostbackEvent(string ctrlName, string args) 
{ 
    //Since this will get called for every postback, we only 
    // want to handle a specific combination of control 
    // and argument. 
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur") 
    { 
     lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now; 
    } 
} 

Alla fine non è terribilmente difficile da simulare eventi lato server, se non ti dispiace scavare nel quadro un po '.

Spero che questo aiuti!

Cheers,
Josh

+0

+1 Josh. Questo è stato davvero molto istruttivo. –

+0

Grazie mille per la tua bellissima risposta Genii. Il tuo post è molto informativo per me. –

+0

Ho visto molti altri suggerimenti su come ottenere questo risultato e la tua risposta è di gran lunga la migliore. Grazie! – Aaron

4
if (!Page.IsPostBack) 
    { 
     txtName.Attributes.Add("onblur","alert('Hello world')"); 
    } 
14

Se si desidera che il server di fare qualcosa dopo la casella di testo perde lo stato attivo è possibile aggiungere AutoPostBack = "True" e, se non si desidera che il postback per ricaricare l'intera pagina, utilizzare un UpdatePanel:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
          OnTextChanged="TextBox1_TextChanged" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

La funzione TextBox1_TextChanged può quindi eseguire un'operazione con il testo (serveride).

+0

Fuori di interesse - come fa l'UpdatePanel fermare il ricaricamento della pagina intera – Kamal

+0

@Kamal ... non è così.Un pannello di aggiornamento non fa nulla per impedire il caricamento dell'intera pagina sul server. In sostanza, ciò che accade è che un postback viene eseguito lato client utilizzando XmlHttpRequest e quindi tutti tranne il contenuto di UpdatePanel vengono gettati e restituiti. Allevia lo "sfarfallio" di un normale postback, ma non risparmia tempo sul server. – Josh

+4

Ricarica l'intera pagina ma invia solo l'html del/i updatepanel (i) e alcuni javascript per aggiornare i contenuti nella risposta. La risposta può essere molto più piccola rispetto al download dell'intera pagina e il browser non deve re-renderizzare la pagina. Questo può velocizzare il processo un po ', l'utente non noterà alcun sfarfallio e l'esperienza sarà molto più agevole. – Willem

0

Perché non si utilizza questo. LostFocus funziona stesso con:

OnTextChanged="TextBox_TextChanged" 
Problemi correlati