Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC中自行处理验证失败_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC中自行处理验证失败

Asp.net mvc 在ASP.NET MVC中自行处理验证失败,asp.net-mvc,Asp.net Mvc,我们都知道我们在开发过程中多次看到的熟悉的ASP.NET错误页面。为了让我的站点保持一致的感觉,我希望用户不要看到这些错误,而是自己处理它们。对于大多数事情,我可以捕获异常并返回自己的错误页面,我们都很高兴 除一个区域外,请求验证。这对我来说是一个恼人的问题,因为异常是在请求到达控制器之前抛出的,所以我能够自己捕获并处理它 我可以将“[ValidateInput(false)]”添加到我的方法中以强制无效请求通过,但显然这是禁用必要的验证检查。有人建议我结合使用“ModelState.IsVal

我们都知道我们在开发过程中多次看到的熟悉的ASP.NET错误页面。为了让我的站点保持一致的感觉,我希望用户不要看到这些错误,而是自己处理它们。对于大多数事情,我可以捕获异常并返回自己的错误页面,我们都很高兴

除一个区域外,请求验证。这对我来说是一个恼人的问题,因为异常是在请求到达控制器之前抛出的,所以我能够自己捕获并处理它

我可以将“[ValidateInput(false)]”添加到我的方法中以强制无效请求通过,但显然这是禁用必要的验证检查。有人建议我结合使用“ModelState.IsValid”来手动调用输入验证,但IsValid似乎总是返回“false”,这没有帮助


如何强制标准输入验证在控制器操作中进行,而不是在之前?

请求验证与模型验证不同。请求验证(您可以使用
[ValidateInput(false)]
禁用)尝试保护潜在危险的用户输入不会到达控制器/操作方法。这就是为什么在输入到达控制器之前从请求管道抛出异常

我认为,如果不使用MVC WebRuntime源代码并使用自己的MVC库分支,就无法改变这种管道行为。你不应该那样做

但是,您可能可以使用global.asax中的
Application\u 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

创建单个基本控制器。将[ValidateInput(false)]添加到控制器类:

 [ValidateInput(false)]
 public class BaseController : Controller
 {

 }
然后更新每个控制器以从中继承:

 public class HomeController : BaseController
 {

 }

我不建议自己关闭请求验证,但如果必须关闭,您可以。

如果要关闭所有控制器和所有操作方法的请求验证,为什么不在应用程序启动期间将其添加为全局筛选器
publicstaticvoidregisterglobalfilters(GlobalFilterCollection过滤器){filters.Add(newvalidateInputAttribute(false));}
您可能不希望每个控制器都使用它。您还可以在web.config中关闭请求验证。