MVC 5中的自定义错误页面

时间:2014-09-15 16:35:39

标签: asp.net asp.net-mvc iis web-config asp.net-mvc-5

我一直在尝试在ASP.NET MVC 5中配置自定义错误页面,但收效甚微。

为此,我遵循了本指南:http://benfoster.io/blog/aspnet-mvc-custom-error-pages

Web.config customerrors

<customErrors mode="On" defaultRedirect="~/500.aspx" redirectMode="ResponseRewrite">
  <error statusCode="401" redirect="~/401.aspx" />
  <error statusCode="403" redirect="~/401.aspx" />
  <error statusCode="404" redirect="~/404.aspx" />      
</customErrors>

Web.config httpErrors

<httpErrors errorMode="Custom" >
  <remove statusCode="401" />
  <error statusCode="401" path="401.html" responseMode="File" />
  <remove statusCode="403" />
  <error statusCode="403" path="401.html" responseMode="File" />
  <remove statusCode="404" />
  <error statusCode="404" path="404.html" responseMode="File"/>
  <remove statusCode="500" />
  <error statusCode="500" path="500.html" responseMode="File" />
</httpErrors>

我已从过滤器配置中删除HandleErrorAttribute

通过此设置,我得到以下结果:

  • 浏览到不存在的静态资源
    示例:http://my.website.com/fakeresource.htm
    这会导致在httpErrors部分中配置静态404.htm文件 Url保留在浏览器地址栏中 正确设置了404状态代码。

  • 浏览错误的路线
    示例:http://my.website/realcontroller/fakeaction
    当找不到匹配的路由时,这会导致HttpException被抛出 显示404.aspx页面 Url保留在浏览器地址栏中 正确设置了404状态代码。

  • 浏览到有效路由,但数据库资源ID无效
    示例:http://my.website.com/realcontroller/realaction/22
    (22是不存在的资源的ID,Action将返回HttpNotFound()方法 这会导致在httpErrors部分中配置静态404.htm文件 Url保留在浏览器地址栏中 正确设置404状态代码 如果我抛出HttpException(404, "Not Found")而不是HttpNotFound(),我会在customErrors

  • 中定义404
  • 例外&amp;未经授权的请求
    所有这些都可以使用Web.config

  • 的配置正常工作

但是,使用ModelSate.IsValid检查ModelState或使用ModelState.AddModelError("InputName", "Error Message");添加错误的任何操作都会导致400 Bad请求。

以下是我在IE&amp;铬:

IE
IE


Chrome

相反,我应该得到的是原始视图,验证消息显示在验证失败的输入旁边。

如果我从web.config中删除httpErrors部分,问题就解决了,但我不再获得自定义IIS错误页面。

我还在existingResponse上尝试了httpErrors属性的每个选项,但不同的选项会中断错误页面或ModelState验证。

最后,我尝试设置Response.TrySkipIisCustomErrors = true;,这似乎解决了我正在测试的操作中的问题。

但这意味着我必须在每个使用ModelState的动作上设置此属性,而且听起来不对。

我做错了什么?

更新 为了测试这是否是项目特定的,我在VS2012中创建了一个新项目并配置了相同的错误页面。令人沮丧的是,一切都奏效了。我现在能想到的唯一区别是遇到问题的项目最初是使用MVC 4开始的,并且升级到了MVC 5.

1 个答案:

答案 0 :(得分:1)

看来自定义错误与我遇到的错误请求无关。 相反,页面上有另一个表单,在发布主表单时也被错误地调用了。