2009-05-19 19 views
6

WebControl A di terze parti genera il seguente codice per visualizzare se stessa:Modifica output HTML lato server in ASP.NET

<div id="uwg"> 
    <input type="checkbox" /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" /> 
</div> 

E 'possibile cambiarlo in

<div id="uwg"> 
    <input type="checkbox" disabled checked /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" disabled checked /> 
</div> 

Quando clicchiamo

<asp:CheckBox id="chk_CheckAll" runat="server" AutoPostBack="true" /> 

situato sulla stessa pagina?

Abbiamo bisogno di farlo sul lato server (in ASP.NET).

Il controllo di terze parti non fornisce un'interfaccia per questo, quindi l'unica possibilità è di lavorare con l'output html. Quale evento della pagina devo gestire (se esiste)? Inoltre, c'è qualche equivalente al modello DOM, o ho bisogno di lavorare con l'output come stringa?

risposta

20

Quando caselle di controllo non vengono eseguiti sul server o sono incapsulati all'interno del controllo, si può utilizzare il seguente metodo:

protected override void Render(HtmlTextWriter writer) 
{ 
    // setup a TextWriter to capture the markup 
    TextWriter tw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(tw); 

    // render the markup into our surrogate TextWriter 
    base.Render(htw); 

    // get the captured markup as a string 
    string pageSource = tw.ToString(); 

    string enabledUnchecked = "<input type=\"checkbox\" />"; 
    string disabledChecked = "<input type=\"checkbox\" disabled checked />"; 

    // TODO: need replacing ONLY inside a div with id="uwg" 
    string updatedPageSource = pageSource; 
    if (chk_CheckAll.Checked) 
    { 
     updatedPageSource = Regex.Replace(pageSource, enabledUnchecked, 
       disabledChecked, RegexOptions.IgnoreCase); 
    } 

    // render the markup into the output stream verbatim 
    writer.Write(updatedPageSource); 
} 

soluzione è tratto da here.

+0

Questo è un metodo per la mia pagina o per webcontrol, ereditato dal controllo di quella terza parte. – Roma

+0

Questa soluzione funziona molto bene nel mio controllo utente in quanto riscrive solo l'output per il controllo individuale in cui ti trovi. Per coloro che non riescono a capire cosa sta facendo, questa funzione sovrascrive il default del form (o dei miei controlli) Renderizza la funzione e sostituisce parte dell'HTML con HTML diverso. – Jrud

4

Ereditare e trovare i controlli nell'albero di controllo e impostare gli attributi in base alle esigenze.

protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     (this.Controls[6] as CheckBox).Disabled = true; 
} 

Ovviamente questo è fragile se il controllo modificherà l'output in base ad altre proprietà o se si aggiorna la libreria; ma se hai bisogno di una soluzione, questo funzionerà.

+0

Ottimo! E, penso, posso ottenere il primo div dal suo id (ha id, anche se non l'ho mostrato), e trovare i suoi elementi figlio per tipo nel modo in cui è mostrato sopra? – Roma

+0

Sì, è possibile utilizzare FindControl ("id") –

+0

Grazie. E posso semplicemente implementare Page.OnPreRender (EventArgs e) per la mia pagina corrente, senza ereditare? – Roma

Problemi correlati