none
Comportamento estranho - Linha gridview para exibir no textbox RRS feed

  • Pergunta

  • Boa Noite Pessoal

    Tenho um gridview que é populado pelo banco de dados e nele tenho o controle que seleciona a linha e mostra no textbox, porem quando eu seleciono a linha que tem o texto. Conforme abaixo.

    No Grid aparece assim:

    CX.PLAST. BRANCA ARO Nº PR. 2035.UB

    Quando eu seleciono a linha e mostra o conteudo no textbox, o texto fica assim.

    CX.PLAST. BRANCA ARO Nº PR. 2035.UB

    Perceberam que o (Nº) ficou assim (Nº).

    O que pode esta acontecendo?

    Grato desde já.

    Paulo Roberto

    quinta-feira, 13 de junho de 2013 21:17

Respostas

  • Olá,

    Acredito que para resolver esta questão, você tem duas opções:

    1) Para a referida coluna, desligar o HtmlEncode:

    <asp:BoundField ... HtmlEncode="false" ></asp:BoundField>

    Porém, isto tem um colateral: os valores que vierem do banco não serão codificado para HTML, assim, se contiver tags HTML ou pior, scripts, eles serão serão "interpretados como parte da página e executados", podendo lhe causar vários problemas.

    2) No método que preenche o TextBox, usar o HtmlDecode da classe HttpUtility:

    TextBox1.Text = HttpUtility.HtmlDecode(ValorCelula);
    Esta segunda forma não tem colateral.


    Diego Cotini do Couto - MCTS .NET Framework 3.5, ASP.NET Applications

    • Marcado como Resposta Prlimasilva sexta-feira, 14 de junho de 2013 12:17
    quinta-feira, 13 de junho de 2013 22:12
  • Olá,

    Exatamente, os caracteres especiais e acentos tem um código em HTML (como o exemplo que você colocou). É recomendado a utilização destes códigos ao invés dos caracteres diretamente, os quais posteriormente o browser irá interpretar e renderizá-los apropriadamente (o que acaba ficando transparente para quem está visualizando a página). 

    Por questões de segurança e para não "quebrar" o HTML o ASP.NET implementa por padrão esta codificação para HTML, convertendo os caracteres especiais para o código HTML (acredito que isto é feito no Bind da GridView) e conforme mencionei na primeira resposta, pode ser desligado setando a propriedade HtmlEncode="false". O input não tem tratamento de códificação HTML e seu conteúdo é tratado sempre como "texto puro", dessa forma se colocar o valor &#186; ele não interpretará como º. Da mesma forma que se colocar uma tag HTML ele não interpretará como tal.

    Existe o método HtmlEncode da classe HttpUtility para realizar esta codificação quando necessário (quando for colocar textos dinâmicos na página e não correr o risco de "quebrar" o HTML ou executar scripts indesejados). 

    Faça dois testes: em um evento da página (pode ser no PageLoad ou no click de um botão), escreva e execute um de cada vez os comandos abaixo:

    1) Response.Write(HttpUtility.HtmlEncode("<script>alert('oi');</script>"));

    2) Response.Write("<script>alert('oi');</script>");

    Realizando o teste, notará que no primeiro caso foi escrito no HTML e no segundo foi executado script. Isto corre justamente pela questão da codificação (se verificar o fonte, no primeiro caso estará codificado). O Response.Write "Escreve" o texto na página devolvida ao usuário (seria a mesma coisa de escrever diretamente no HTML) e quando não codificado o browser interpreta como um script (e que, na verdade é, uma vez que não foi codificado).

    O mesmo aconteceria na sua Grid se a propriedade HtmlEncode estivesse desligada e viesse um valor assim.


    Diego Cotini do Couto - MCTS .NET Framework 3.5, ASP.NET Applications


    • Marcado como Resposta Prlimasilva sexta-feira, 14 de junho de 2013 14:15
    • Editado Diego Cotini sexta-feira, 14 de junho de 2013 14:42
    sexta-feira, 14 de junho de 2013 13:45

Todas as Respostas

  • Olá,

    Acredito que para resolver esta questão, você tem duas opções:

    1) Para a referida coluna, desligar o HtmlEncode:

    <asp:BoundField ... HtmlEncode="false" ></asp:BoundField>

    Porém, isto tem um colateral: os valores que vierem do banco não serão codificado para HTML, assim, se contiver tags HTML ou pior, scripts, eles serão serão "interpretados como parte da página e executados", podendo lhe causar vários problemas.

    2) No método que preenche o TextBox, usar o HtmlDecode da classe HttpUtility:

    TextBox1.Text = HttpUtility.HtmlDecode(ValorCelula);
    Esta segunda forma não tem colateral.


    Diego Cotini do Couto - MCTS .NET Framework 3.5, ASP.NET Applications

    • Marcado como Resposta Prlimasilva sexta-feira, 14 de junho de 2013 12:17
    quinta-feira, 13 de junho de 2013 22:12
  • Olá Diego

    Muito obrigado por sua ajuda, testei logo a segunda opção e funcionou perfeitamente.

    Um outro detalhe você tem ideia porque esteja acontecendo isso?

    Pois eu fui direto no banco e a informação está correta (nº)

    No debug (breackpoint), vi que o campo fica assim (N&#186;) dentro da grid dentro do (código)

    Mais no html exibe normalmente (nº).

    Pelo que pesquisei na net esse código( &#186; ) representa o (indicador ordinal ( º ) ).

    E mais uma vez muito obrigado.

    Paulo Roberto


    sexta-feira, 14 de junho de 2013 12:17
  • Olá,

    Exatamente, os caracteres especiais e acentos tem um código em HTML (como o exemplo que você colocou). É recomendado a utilização destes códigos ao invés dos caracteres diretamente, os quais posteriormente o browser irá interpretar e renderizá-los apropriadamente (o que acaba ficando transparente para quem está visualizando a página). 

    Por questões de segurança e para não "quebrar" o HTML o ASP.NET implementa por padrão esta codificação para HTML, convertendo os caracteres especiais para o código HTML (acredito que isto é feito no Bind da GridView) e conforme mencionei na primeira resposta, pode ser desligado setando a propriedade HtmlEncode="false". O input não tem tratamento de códificação HTML e seu conteúdo é tratado sempre como "texto puro", dessa forma se colocar o valor &#186; ele não interpretará como º. Da mesma forma que se colocar uma tag HTML ele não interpretará como tal.

    Existe o método HtmlEncode da classe HttpUtility para realizar esta codificação quando necessário (quando for colocar textos dinâmicos na página e não correr o risco de "quebrar" o HTML ou executar scripts indesejados). 

    Faça dois testes: em um evento da página (pode ser no PageLoad ou no click de um botão), escreva e execute um de cada vez os comandos abaixo:

    1) Response.Write(HttpUtility.HtmlEncode("<script>alert('oi');</script>"));

    2) Response.Write("<script>alert('oi');</script>");

    Realizando o teste, notará que no primeiro caso foi escrito no HTML e no segundo foi executado script. Isto corre justamente pela questão da codificação (se verificar o fonte, no primeiro caso estará codificado). O Response.Write "Escreve" o texto na página devolvida ao usuário (seria a mesma coisa de escrever diretamente no HTML) e quando não codificado o browser interpreta como um script (e que, na verdade é, uma vez que não foi codificado).

    O mesmo aconteceria na sua Grid se a propriedade HtmlEncode estivesse desligada e viesse um valor assim.


    Diego Cotini do Couto - MCTS .NET Framework 3.5, ASP.NET Applications


    • Marcado como Resposta Prlimasilva sexta-feira, 14 de junho de 2013 14:15
    • Editado Diego Cotini sexta-feira, 14 de junho de 2013 14:42
    sexta-feira, 14 de junho de 2013 13:45
  • Olá Diego

    Entendi perfeitamente sua explicação... 

    Mais uma coisa que aprendi! rsrs

    Muito obrigado por sua ajuda.

    sexta-feira, 14 de junho de 2013 14:11
  • Muito boa solução Diego, utilizei o segundo exemplo!

    segue o que fiz com o exemplo citado acima:

    TextBox1.Text = HttpUtility.HtmlDecode(NOMEGRIDVIEW.SelectedRow.Cell[3].Text.Trim());

    Votei lá já, vlw !!


    Leandro Lima.


    • Editado Leandro Gafa quarta-feira, 9 de dezembro de 2015 11:41 texto
    quarta-feira, 9 de dezembro de 2015 11:37