Exibir string como html em asp.net mvc view

98

Eu tenho um controlador que gera string contendo marcações html. Agora, quando estou exibindo-o em visualizações, ele é exibido como string simples contendo todas as tags. Tentei usar o auxiliar Html para codificar / decodificar para exibi-lo corretamente, mas não está funcionando.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

Em minhas opiniões,

@Html.Encode(str)
Mukesh Sharma
fonte
6
Acho que Html.Rawdeve ajudar.
Saeed Neamati
Também acho que você pode usar a HtmlStrinclasse, como emHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Respostas:

168

Você está perto e deseja usar @Html.Raw(str)

@Html.Encoderecebe cadeias de caracteres e garante que todos os caracteres especiais sejam tratados corretamente. Isso inclui caracteres como espaços.

Jared
fonte
6
@ Html.Raw é exatamente o que eu estava procurando, obrigado pela resposta :)
AFract
IHtmlString conforme mencionado por @Jerad Rose é muito melhor
Pratyush Dhanuka de
37

Em IHtmlStringvez disso, você deveria usar :

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Sempre que você tem propriedades ou variáveis ​​de modelo que precisam conter HTML, sinto que geralmente é uma prática melhor. Em primeiro lugar, é um pouco mais limpo. Por exemplo:

@Html.Raw(str)

Comparado com:

@str

Além disso, também acho que é um pouco mais seguro do que usar @Html.Raw(), já que a preocupação de saber se seus dados são HTML é mantida em seu controlador. Em um ambiente onde você tem desenvolvedores front-end vs. back-end, seus desenvolvedores back-end podem estar mais sintonizados com quais dados podem conter valores HTML, mantendo assim essa preocupação no back-end (controlador).

Geralmente tento evitar o uso, Html.Raw()sempre que possível.

Outra coisa que vale a pena observar é que não tenho certeza para onde você está atribuindo str, mas algumas coisas que me preocupam em como você pode estar implementando isso.

Primeiro, isso deve ser feito em um controlador, independentemente de sua solução ( IHtmlStringou Html.Raw). Você deve evitar qualquer lógica como essa em sua visão, pois ela realmente não pertence a ela.

Além disso, você deve usar seu ViewModelpara obter valores para sua visualização (e novamente, de preferência usando IHtmlStringcomo o tipo de propriedade). Ver algo assim @Html.Encode(str)é um pouco preocupante, a menos que você esteja fazendo isso apenas para simplificar seu exemplo.

Jerad Rose
fonte
1
Gostaria de salientar que os controladores são para roteamento e não armazenamento de dados. Além disso, seus desenvolvedores de back-end devem saber melhor do que nunca alterar o contrato existente do código. A IU deve ser vinculada a um modelo e, se o modelo mudar drasticamente, seus testes de unidade serão interrompidos.
Anthony Mason
Obrigado pela sua resposta. Eu gosto disso.
Thomas.Benz
Sim, esta resposta é muito melhor, inicialmente usei Html.Raw, mas quando li esta resposta, mudei imediatamente
Pratyush Dhanuka
7

você pode usar @Html.Raw(str)

Veja MSDN para mais

Retorna marcação que não é codificada em HTML.

Este método envolve a marcação HTML usando a classe IHtmlString, que renderiza HTML não codificado.

AthibaN
fonte
1

Eu tive um problema semelhante com campos de entrada HTML no MVC. A página da web mostrava apenas a primeira palavra-chave do campo. Exemplo: campo de entrada: "A raposa marrom rápida" Valor exibido: "A"

A resolução foi colocar a variável entre aspas na declaração de valor da seguinte forma:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Roland Wales
fonte
0

Tive um problema semelhante recentemente, e o google me colocou aqui, então coloco esta resposta aqui no caso de outros pousarem aqui também, para completar.

Eu percebi que quando eu tinha formatado html incorretamente , eu estava tendo todas as minhas tags html removidas , com apenas o conteúdo não tag restante . Eu particularmente tive uma tabela sem uma tag de abertura de tabela, e então todas as minhas tags html de toda a string foram completamente arrancadas.

Portanto, se o procedimento acima não funcionar e você ainda estiver coçando a cabeça, verifique também o html para ser válido.

Percebi que mesmo depois de fazer funcionar, o MVC estava adicionando tags tbody onde eu não tinha nenhuma. Isso me diz que está acontecendo uma limpeza (MVC 5) e que, quando não pode acontecer, remove todas / algumas tags.

Greg
fonte