Modificar saída html no lado do servidor no ASP.NET

votos
6

WebControl de um terceiro gera o seguinte código para exibir-se:

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

É possível alterá-lo para

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

Quando clicar em

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

localizado na mesma página?

Precisamos fazê-lo no lado do servidor (em ASP.NET).

controle de que terceiros não dá interface para isso, então a única possibilidade é trabalhar com a saída de html. Que página do evento devo lidar com (se houver)? Além disso, existe algum equivalente ao modelo DOM, ou eu preciso trabalhar com saída de corda?

Publicado 19/05/2009 em 17:58
fonte usuário
Em outras línguas...                            


2 respostas

votos
20

Quando caixas não são executados no servidor ou são encapsulados dentro do controle, podemos usar o seguinte 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);
}

Solução é tomada a partir daqui .

Respondeu 19/05/2009 em 21:45
fonte usuário

votos
4

Herdá-la e encontrar os controles na árvore de controle e definir atributos conforme o caso.

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

Obviamente, isso é frágil se o controle irá modificar sua saída dependendo de outras propriedades, ou se você atualizar a biblioteca; mas se você precisa de uma solução alternativa, isso vai funcionar.

Respondeu 19/05/2009 em 18:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more