我们都知道在开发过程中我们多次看到的熟悉的ASP.NET错误页面。为了保持对我的网站的一致感觉,我宁愿用户看不到这些错误,并自己处理它们。对于大多数事情,我可以捕获异常并返回我自己的错误页面,我们都很高兴。
除了一个区域,请求验证。这对我来说很烦人,因为在请求到达控制器之前抛出异常,所以我能够自己捕获并处理它。
我可以在我的方法中添加“[ValidateInput(false)]”以强制通过无效请求,但显然这会禁用必要的验证检查。我建议我结合使用“ModelState.IsValid”手动调用输入验证,但IsValid似乎总是返回'false',这没有任何帮助。
如何在我的控制器操作中强制执行标准输入验证,而不是之前?
答案 0 :(得分:3)
请求验证与模型验证不同。请求验证(您可以使用[ValidateInput(false)]
禁用)尝试保护潜在危险的用户输入不会到达您的控制器/操作方法。这就是在输入到达控制器之前从请求管道抛出异常的原因。
我不认为您可以在不使用MVC WebRuntime源代码并使用您自己的MVC库的个人分支的情况下更改此管道行为。你不应该这样做。
但是,您可以使用global.asax中的Application_Error
来处理错误并重定向到自定义错误页面。
var ex = Server.GetLastError();
if (ex == null) return;
if (ex.GetType() == typeof(HttpException) && ex.Message.StartsWith(
"A potentially dangerous Request.Path value was detected from the client"))
// redirect to your custom error page here
答案 1 :(得分:0)
创建一个基本控制器。将[ValidateInput(false)]添加到控制器类:
[ValidateInput(false)]
public class BaseController : Controller
{
}
然后更新每个控制器以继承它:
public class HomeController : BaseController
{
}
我不建议自己关闭请求验证,但如果必须,可以。