none
Problema caracter especial Model > View com Razor RRS feed

  • 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

    quinta-feira, 1 de novembro de 2012 17:44

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

    segunda-feira, 5 de novembro de 2012 14:24
  • 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!

    quarta-feira, 7 de novembro de 2012 16:42

Todas as Respostas

  • O razor deveria exibir como string por padrão.

    Como você está fazendo isso?


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quinta-feira, 1 de novembro de 2012 18:10
  • 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
    quinta-feira, 1 de novembro de 2012 18:18
  • 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

    segunda-feira, 5 de novembro de 2012 13:56
  • 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

    segunda-feira, 5 de novembro de 2012 13:58
  • Tenta isso quando retornar o valor:

    var path = Server.HtmlEncode(@"\\pasta\subpasta\arquivo.txt");


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 5 de novembro de 2012 14:24
  • 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!

    quarta-feira, 7 de novembro de 2012 16:42
  • 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

    quarta-feira, 7 de novembro de 2012 17:12
  • 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

    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
    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

    quarta-feira, 7 de novembro de 2012 17:23
  • 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.


    quarta-feira, 7 de novembro de 2012 18:04