Como posso permitir que um usuário insira HTML em um campo específico usando o ASP.net MVC.
Eu tenho um formulário longo com muitos campos que são mapeados para esse objeto complexo no controlador.
Gostaria de fazer com que um campo (a descrição) permita HTML, no qual executarei meu próprio saneamento posteriormente.
Respostas:
Adicione o seguinte atributo à ação (post) no controlador para o qual você deseja permitir o HTML:
Editar: De acordo com os comentários de Charlino :
No seu web.config, defina o modo de validação usado. Consulte MSDN :
Editar setembro de 2014: de acordo com o sprinter252 comentários:
Agora você deve usar o
[AllowHtml]
atributo Veja abaixo no MSDN :fonte
<httpRuntime requestValidationMode="2.0" />
seu arquivo web.config.E o
[AllowHtml]
atributo acima da propriedade?fonte
MetadataTypeAttribute
e é preferível, pois permite apenas HTML nos campos individuais, e não no objeto inteiro.Adicionar ao modelo:
E para sua propriedade
Este código do meu ponto da melhor maneira evitar esse erro. Se você estiver usando o editor de HTML, não terá problemas de segurança porque ele já está restrito.
fonte
Adicionar
[AllowHtml]
a propriedade específica é a solução recomendada, pois há muitos blogs e comentários sugerindo diminuir o nível de segurança, o que deve ser inaceitável.Adicionando isso, a estrutura MVC permitirá que o Controlador seja atingido e o código nesse controlador seja executado.
No entanto, depende do seu código, filtros, etc., como a resposta é gerada e se existe alguma validação adicional que possa desencadear outro erro semelhante.
De qualquer forma, adicionar
[AllowHtml]
atributo é a resposta certa, pois permite que o html seja desserializado no controlador. Exemplo no seu viewmodel:fonte
Eu enfrentei o mesmo problema, embora eu tenha adicionado
[System.Web.Mvc.AllowHtml]
à propriedade em questão, conforme descrito em algumas respostas.No meu caso, eu tenho uma
UnhandledExceptionFilter
classe que acessa o objeto Request antes que a validação do MVC ocorra (e, portanto, AllowHtml não tem efeito) e esse acesso gera a[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
.Isso significa que acessar determinadas propriedades de um objeto Request dispara implicitamente a validação (no meu caso, é a
Params
propriedade).Uma solução para impedir a validação está documentada no MSDN
Portanto, se você tiver um código como este
mude para
ou apenas use a
Form
propriedade que parece não acionar a validaçãofonte
Se você precisar permitir a entrada html para o parâmetro do método de ação (ao contrário de "propriedade do modelo"), não há uma maneira integrada de fazer isso, mas você pode facilmente conseguir isso usando um fichário de modelo personalizado:
O código AllowHtmlBinder:
Encontre o código fonte completo e a explicação na minha postagem no blog: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
fonte
A codificação de URL dos dados também funciona para mim
Por exemplo
var data = '<b> Olá </b>'
Na chamada do navegador, encodeURIComponent (data) antes de postar
No servidor, chame HttpUtility.UrlDecode (received_data) para decodificar
Dessa forma, você pode controlar exatamente qual área de campos pode ter html
fonte
Eu enfrentei esse problema durante o desenvolvimento de um site de comércio eletrônico usando o NopCommerce, obtive essa solução de três maneiras diferentes, como nas respostas anteriores. Mas, de acordo com a estrutura do NopCommerce, não encontrei esses três por vez. Acabei de ver que lá eles estão usando apenas
[AllowHtml]
e está funcionando bem, exceto qualquer problema. Como anteriormente solicitado questãoPessoalmente, não prefiro
[ValidateInput(false)]
porque estou ignorando a verificação total de entidades do modelo, o que é inseguro. Mas se alguém escrever, dê uma olhada aquidepois, pule apenas uma propriedade única e permita apenas uma propriedade específica e verifique quase todas as outras entidades. Portanto, parece preferível ao meu.
fonte
No meu caso, o atributo AllowHtml não estava funcionando quando combinado com o filtro de ação OutputCache. Esta resposta resolveu o problema para mim. Espero que isso ajude alguém.
fonte
Você pode usar o
[AllowHtml]
seu projeto por exemploPara usar este código na biblioteca de classes, você instalou este pacote
Após o uso
using
fonte
Infelizmente, nenhuma das respostas aqui funcionou para mim.
Acabei usando o Custom Model Binding e usei um Sanitizer de terceiros.
Veja minha pergunta auto-respondida aqui .
fonte