Lidando com HttpRequestValidationException normalmente e compatível com ASP.net AJAX?
-
09-06-2019 - |
Pergunta
ValidateEvents é uma ótima função do ASP.net, mas a Tela Amarela da Morte não é tão legal.Eu encontrei uma maneira de lidar com HttpRequestValidationException normalmente aqui, mas isso não funciona corretamente com o ASP.net AJAX.
Basicamente, recebi um UpdatePanel com um TextBox e um Button, e quando o usuário digita HTML no Textbox, um JavaScript Popup com uma mensagem de erro dizendo para não modificar a resposta aparece.
Então, eu me pergunto qual é a melhor maneira de lidar com HttpRequestValidationException normalmente?Para solicitações "normais", gostaria apenas de exibir uma mensagem de erro, mas quando for uma solicitação AJAX, gostaria de descartar a solicitação e retornar algo para indicar um erro, para que minha página front-end possa reagir a ela?
Solução
Encontrei e blogou sobre isso.Basicamente, EndRequestHandler e args.set_errorHandled são nossos amigos aqui.
<script type="text/javascript" language="javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args) {
if (args.get_error() != undefined)
{
var errorMessage;
if (args.get_response().get_statusCode() == '200')
{
errorMessage = args.get_error().message;
}
else
{
// Error occurred somewhere other than the server page.
errorMessage = 'An unspecified error occurred. ';
}
args.set_errorHandled(true);
$get('<%= this.newsletterLabel.ClientID %>').innerHTML = errorMessage;
}
}
</script>
Outras dicas
hmmmm, parece que você precisaria encontrar algum tipo de JavaScript para verificar a entrada html ou um validador do lado do cliente.
Isso é o que eu gostaria de evitar, se possível, mas parece ser muito mais complicado do que o esperado.
Normalmente todos aconselham usar o AsyncPostBackError do ScriptManager, mas isso não funciona se chamado no Global.asax.Infelizmente, como HttpRequestValidationException é emitido pelo tempo de execução, ele nunca entra no meu código e não posso fazer muito dentro do Application_Error.
Então, sim, isso precisa ser feito no JavaScript, só espero que haja uma maneira de adicionar um "gancho" como a função BeginRequestHandler para que eu não precise "hackear" o código da Microsoft.Se eu encontrar uma solução antes de outra pessoa, colocarei aqui :-)