优雅地处理HttpRequestValidationException和与ASP.net AJAX兼容?

时间:2020-03-05 18:48:48  来源:igfitidea点击:

ValidateEvents是一个很棒的ASP.net函数,但是"死亡黄屏"并不是那么好。我在这里找到了一种如何优雅地处理HttpRequestValidationException的方法,但这不适用于ASP.net AJAX。

基本上,我得到了一个带有文本框和按钮的UpdatePanel,并且当用户在文本框中输入HTML时,会弹出带有错误消息的JavaScript弹出窗口,提示我们不修改响应。

因此,我想知道优雅地处理HttpRequestValidationException的最佳方法是什么?对于"正常"请求,我只想显示一条错误消息,但是当它是AJAX请求时,我想丢弃该请求并返回某些内容以指示错误,以便前端页面可以对此做出反应?

解决方案

回答

嗯,看来我们需要找到某种JavaScript来检查html输入或者客户端验证程序。

回答

如果可能的话,这就是我要避免的事情,但这似乎比预期的要复杂得多。

通常,每个人都建议使用ScriptManager的AsyncPostBackError,但是如果在Global.asax上调用,则不起作用。不幸的是,由于HttpRequestValidationException是由运行时发出的,因此它永远不会输入我的代码,并且我无法在Application_Error中做任何事情。

因此,是的,它确实需要在JavaScript中完成,我只是希望有一种添加像BeginRequestHandler-Function这样的"钩子"的方法,这样我就不必"黑客" Microsoft代码。如果我在其他人之前找到解决方案,我会在这里提出:-)

回答

找到了它,并在此发布了博客。基本上,EndRequestHandler和args.set_errorHandled是我们的朋友。

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