Usuário com melhor resposta
Problema caracter especial Model > View com Razor

Pergunta
-
Sres., boa tarde.
Tenho uma model com uma propriedade string que armazena um caminho de rede
Ex.: \\rede\pasta01\subpasta
Quando vou na View chamar a propriedade que esta armazenada essa informação os caracteres "\" tem efeito inesperado, não é tratado como string e sim como comando (como quebra de linha ou commandline). E quando passo para uma variavel em javascript piora tudo.
Ja usei varias maneiras como o chr(92) para conversão e replace, mais não rolou. Alguem teria alguma ideia de como fazer para esses caracteres serem tratados como string na passagem da Model para View e vice-versa e para passagem da Model para variavel em Javascript e vice-versa?
Obrigado,
Se a minha resposta lhe foi util, marque "Propor como Proposta" para qualificar o conteudo do fórum. Obrigado, Vinicius Nunes Macedo
Respostas
-
Tenta isso quando retornar o valor:
var path = Server.HtmlEncode(@"\\pasta\subpasta\arquivo.txt");
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:14
-
Tente fazer na variável JS : \\\\pasta\\subpasta\\arquivo.txt";
Se não der, tente colocar o valor da variável para um <input text="hidden" id="path"> e via jquery adquira o caminho: $('#path').val();
Faça e me fale se deu certo...
Ao infinito e além!
- Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:12
Todas as Respostas
-
-
Tente utilizar verbatim string, colocando um "@" antes da string.
No controller:
ViewBag.MeuCaminho = @"\\rede\pasta01\subpasta";
OU
ViewBag.Str = "\\\\rede\\pasta\\lol";
Na View:
<p>@ViewBag.MeuCaminho</p>
O problema acontece que quando você colocar um "\" o C# espera um caracter para fazer algo especial... sendo assim, quando você realmente quiser colocar uma "\" você deve usar "\\". Só que no seu exemplo aconteceu outra coisa com \\rede, pois "\r" é um comando que "resetaria" a linha, voltando para o incio do campo... então quando usamos "\\\rede" ele entendende "\\ + \r", ou seja "\" + reset... mas não isso que queremos, queremos 2 "\" e sem reset, então "\\\\rede...". Meio complicado de explicar, espero ter sido claro =/
Agora tudo isso pode ser resolvido colocando um "@" antes de string, assim o c# vai reconhecer a string sem nenhum comando especial ...
Ao infinito e além!
- Editado Fabio R. Luz quinta-feira, 1 de novembro de 2012 18:19
-
Opa Murilo, obrigado pelo retorno.
Então, na View com o Model referenciado, eu vejo o valor "\\pasta\subpasta\arquivo.txt" normalmente.
Quando atribuo esse valor para uma variavel javascript
foreach (var item in Model.ListadeUmaEntidade)
{
<script type="text/javascript">
$("#NomeDoCampo").val('item.NomeDoCampoNaModel');
</script>
}Neste momento o valor fica assim: "\pastasubpastaarquivo.txt" , ou seja, ele não atribui corretamente o valor com os caracteres especiais.
E quando devolvo esse valor de volta para a model utilizando o framework do Json, ele duplica os caracteres especiais.
Conhece alguma solução para esse problema?
Se a minha resposta lhe foi util, marque "Propor como Proposta" para qualificar o conteudo do fórum. Obrigado, Vinicius Nunes Macedo
-
Fabio, valeu pelo retorno.
Então, a solução com @ no ambiente server-side rola numa boa, o problema é quando tento passar o valor: "\\pasta\subpasta\arquivo.txt" para uma variavel javascript. Pois o resultado dentro da variavel seria: "\pastasubpastaarquivo.txt"
É neste ponto que eu queria utlizar algum metodo para que ele nao interprete o caracter especial
Se a minha resposta lhe foi util, marque "Propor como Proposta" para qualificar o conteudo do fórum. Obrigado, Vinicius Nunes Macedo
-
Tenta isso quando retornar o valor:
var path = Server.HtmlEncode(@"\\pasta\subpasta\arquivo.txt");
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:14
-
Tente fazer na variável JS : \\\\pasta\\subpasta\\arquivo.txt";
Se não der, tente colocar o valor da variável para um <input text="hidden" id="path"> e via jquery adquira o caminho: $('#path').val();
Faça e me fale se deu certo...
Ao infinito e além!
- Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:12
-
Opa Fabio,
Tambem não rolou. Mais vou fazer diferente. Quando começa a criar mtos replaces algo esta errado. Eu fiz um paleativo para atender a necessidade de imediato.
Mais vou criar um teste, para simular o problema e ver como fazer com a menor conversão possivel entre as passagens View/Controller e vice-versa.
Mais valeu pela ajuda.
Se a minha resposta lhe foi util, marque "Propor como Proposta" para qualificar o conteudo do fórum. Obrigado, Vinicius Nunes Macedo
-
Opa Murilo,
Tambem não rolou. o encode é para conversão de url somente. neste caso ele não converteu as barras por que o codigo é utf. mais como passei para o Fabio, fiz um paleativo e vou criar um projeto a parte para testar as possibilidades com a menor conversão possivel.
Mais valeu pela ajuda.
Se a minha resposta lhe foi util, marque "Propor como Proposta" para qualificar o conteudo do fórum. Obrigado, Vinicius Nunes Macedo
- Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:14
- Não Marcado como Resposta Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 17:14
-
Você testou o que eu falei?
Esse método vai transformar '\' em '\\' para ser entendido pelo javascript.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Editado Murilo Kunze quarta-feira, 7 de novembro de 2012 17:14
-
Vinicius, o HtmlEncode vai encodar qualquer texto independente se for url ou não.
Eu criei uma página exatamente com o que você descreveu, e quando uso o HtmlEncode o texto é entendido correto no js.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
-
Opa Murilo,
No passo-a-passo que eu fiz, o valor começa dar problema na VIEW.
Ex.:A informação no banco de dados: "\\pasta\subpasta\aqruivo.txt"
Quando atribuo o valor em um controle da View o valor se mantém. Ex.:
@Html.EditorFor(model => model.Campo)
Agora quando faço um laço o valor se perde. Ex.:
foreach (var item in Model.ListaCampo)
{
// neste momento antes de entrar no javascript
// o valor ja se encontra alterado
// "\\\\pasta\\subpasta\arquivo.txt"<script type="text/javascript">
$("#campo").val('@item.Campo');
</script>
}No debug, o valor na primeira entrada do laço no campo "item.Campo", antes de insiri-lo no JQuery. "\\\\pasta\\subpasta\\arquivo.txt"
Para resolver neste momento do código, fiz o seguinte dentro do foreach. antes de entrar no <script> inseri a seguinte linha:
item.Caminho = item.Caminho.Replace("\\", "\\\\").Replace(@"\", "\\");
Pois, se não faço isso, a linha na visualização fica: "\\pastasubpastaarquivo.txt" ou seja, a "\" começa a valer como comando UTF32.
Isto que eu fiz foi um paleativo, e quando retorno via Json para a Controller, mais convert dentro da Controller, e creio ter uma maneira mais elegante do que encher o codigo de convert.
- Editado Vinicius Nunes Macedo quarta-feira, 7 de novembro de 2012 18:07