使用自定义操作过滤器

时间:2017-07-11 12:32:33

标签: c# asp.net .net model-view-controller

我正在使用的框架是ASP.NET MVC 5.当用户提交包含潜在恶意代码的表单/查询字符串时,应用程序会生成HttpRequestValidationException。

我当前的代码在Application_Error中捕获此异常并执行重定向到错误视图,该错误视图通知用户提交的问题。问题是某些请求需要返回MVC视图,而其他请求则需要Json响应。

    protected void Application_Error()
    {
        var exception = Server.GetLastError();

        if (exception is HttpRequestValidationException)
        {
            Response.Clear();
            Server.ClearError();
            Response.Redirect("~/Error/UnsafeRequest");
            return;
        }
    }

我正在考虑的解决方案是使用包含相同逻辑的动作过滤器替换模型绑定阶段中发生的默认验证,但根据情况可以更具适应性(例如,不同的重定向)。 / p>

这是完全可能还是我走错了路?

2 个答案:

答案 0 :(得分:1)

您可以使用“接受”等标题值来调整响应...

if (Request.Headers["Accept"].Count() > 0 && Request.Headers["Accept"] == "application/json")
{
    //Create your JSON response...
}
else
{
    Response.Redirect("~/Error/UnsafeRequest");
}

答案 1 :(得分:1)

您尝试使用此代码自定义操作过滤器:

public class CustomFilterAttribute : HandleErrorAttribute
{ 
    public override void OnException(ExceptionContext filterContext)
    {
         if(filterContext.Exception is HttpRequestValidationException)
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary{
                    { "action", "UnsafeRequest" },
                    { "controller", "Error" }
                });
        }
    }
}