2009-05-19 24 views
6

de webcontrol Una de terceros genera el siguiente código para mostrar en sí:Modificar salida HTML del lado del servidor en ASP.NET

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

¿Es posible el cambio a

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

Cuando hacemos clic en

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

ubicado en la misma página?

Tenemos que hacerlo en el lado del servidor (en ASP.NET).

El control de esa tercera parte no proporciona la interfaz para esto, por lo que la única posibilidad es trabajar con la salida html. ¿Qué evento de página debo manejar (si corresponde)? Además, ¿hay algún equivalente al modelo DOM, o necesito trabajar con salida como cadena?

Respuesta

20

Cuando casillas de verificación no se ejecutan en el servidor o se encapsulan dentro del control, se puede utilizar el siguiente método:

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); 
} 

Solution se toma de here.

+0

Este es un método para mi página o para el control web, heredado del control de ese tercero. – Roma

+0

Esta solución funciona muy bien en mi control de usuario ya que solo reescribe la salida para el control individual en el que se encuentra. Para aquellos que no pueden entender lo que está haciendo, esta función anula la predeterminada del formulario (o en mi caso) Renderiza la función y reemplaza parte del código HTML con HTML diferente. – Jrud

4

Suéltalo y encuentra los controles en el árbol de control, y configura los atributos según corresponda.

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

Obviamente, esto es frágil si el control va a modificar su producción en función de otras propiedades, o si actualizar la biblioteca; pero si necesita una solución alternativa, esto funcionará.

+0

¡Genial! Y, creo, puedo obtener el primer div por su id (tiene id, aunque no lo mostré), y encuentro sus elementos secundarios por tipo de la manera similar a la que se muestra arriba. – Roma

+0

Sí, puede usar FindControl ("id") –

+0

Gracias. ¿Y puedo simplemente implementar Page.OnPreRender (EventArgs e) para mi página actual, sin heredar? – Roma

Cuestiones relacionadas