我一直在尝试在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
例外&amp;未经授权的请求
所有这些都可以使用Web.config
但是,使用ModelSate.IsValid
检查ModelState或使用ModelState.AddModelError("InputName", "Error Message");
添加错误的任何操作都会导致400 Bad请求。
以下是我在IE&amp;铬:
IE
铬
相反,我应该得到的是原始视图,验证消息显示在验证失败的输入旁边。
如果我从web.config中删除httpErrors
部分,问题就解决了,但我不再获得自定义IIS错误页面。
我还在existingResponse
上尝试了httpErrors
属性的每个选项,但不同的选项会中断错误页面或ModelState
验证。
最后,我尝试设置Response.TrySkipIisCustomErrors = true;
,这似乎解决了我正在测试的操作中的问题。
但这意味着我必须在每个使用ModelState
的动作上设置此属性,而且听起来不对。
我做错了什么?
更新 为了测试这是否是项目特定的,我在VS2012中创建了一个新项目并配置了相同的错误页面。令人沮丧的是,一切都奏效了。我现在能想到的唯一区别是遇到问题的项目最初是使用MVC 4开始的,并且升级到了MVC 5.
答案 0 :(得分:1)
看来自定义错误与我遇到的错误请求无关。 相反,页面上有另一个表单,在发布主表单时也被错误地调用了。