选项一:
是构建一个带有“NotFound”视图和“Unknown”视图的错误控制器。这将接受任何 500 服务器错误或 404 NotFound 错误并将您重定向到适当的 URL。我并不完全喜欢这个解决方案,因为访问者总是被重定向到错误页面。
http://example.com/Error/Unknown
<customErrors mode="On" defaultRedirect="Error/Unknown">
<error statusCode="404" redirect="Error/NotFound" />
<error statusCode="500" redirect="Error/Unknown" />
</customErrors>
选项二:
我绝对不喜欢这种方法(因为它基本上是恢复到 Web 表单,第二种选择是简单地拥有一个静态 Error.aspx 页面并忽略 MVC 中的路由),但它仍然有效。您在这里所做的是忽略“静态”目录,将您的物理错误页面放在那里,并绕过 MVC。
routes.IgnoreRoute("/Static/{*pathInfo}"); //This will ignore everything in the "Static" directory
选项三:
第三个选项(这是我最喜欢的)是从捕获错误的任何视图返回一个错误视图。这将要求您在“已知”错误的过程中编写 Try/Catch 块,然后您可以使用 HandleError 处理可能出现的未知错误。这将保留最初请求的 URL,但返回 ERROR 视图。
示例:
http ://example.com/Products/1234将显示 ProductID 1234 的详细信息页面
http://example.com/Products/9999将显示NotFound错误页面,因为 ProductID 9999 不存在
http://example .com/Errors/NotFound “应该”永远不会显示,因为您在控制器中单独处理这些错误。
网络配置
<customErrors mode="On">
</customErrors>
控制器
// Use as many or as few of these as you need
[HandleError(ExceptionType = typeof(SqlException), View = "SqlError")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullError")]
[HandleError(ExceptionType = typeof(SecurityException), View = "SecurityError")]
[HandleError(ExceptionType = typeof(ResourceNotFoundException), View = "NotFound")]
Public Class ProductController: Controller{
public ViewResult Item(string itemID)
{
try
{
Item item = ItemRepository.GetItem(itemID);
return View(item);
}
catch()
{
return View("NotFound");
}
}
}
文件夹结构
- wwwroot/
- 控制器/
- 共享/
- 未找到.aspx
- 空错误.aspx
- 安全错误.aspx
- SqlError.aspx
- 观看次数/
选项四:
最后一个选项是您为之类的东西构建自己的自定义过滤器ResourceNotFoundException
并将其附加到您的控制器类。这将做与上面完全相同的事情,但还有一个额外的好处,就是将错误代码也发送到客户端。
Richard Dingwall 在他的博客上谈到了它。