Usuário com melhor resposta
Comportamento estranho - Linha gridview para exibir no textbox

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
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
-
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 º 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
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
-
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º) dentro da grid dentro do (código)
Mais no html exibe normalmente (nº).
Pelo que pesquisei na net esse código( º ) representa o (indicador ordinal ( º ) ).
E mais uma vez muito obrigado.
Paulo Roberto
-
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 º 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
-
-
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