Dựa trên câu trả lời được đăng bởi maxspan, tôi đã tập hợp một dự án mẫu tối thiểu trên GitHub hiển thị tất cả các phần làm việc.
Về cơ bản, chúng tôi chỉ cần thêm một Application_Error
phương thức vào global.asax.cs để chặn ngoại lệ và cho chúng tôi cơ hội chuyển hướng (hay chính xác hơn là chuyển yêu cầu ) sang trang lỗi tùy chỉnh.
protected void Application_Error(Object sender, EventArgs e)
{
// See http://stackoverflow.com/questions/13905164/how-to-make-custom-error-pages-work-in-asp-net-mvc-4
// for additional context on use of this technique
var exception = Server.GetLastError();
if (exception != null)
{
// This would be a good place to log any relevant details about the exception.
// Since we are going to pass exception information to our error page via querystring,
// it will only be practical to issue a short message. Further detail would have to be logged somewhere.
// This will invoke our error page, passing the exception message via querystring parameter
// Note that we chose to use Server.TransferRequest, which is only supported in IIS 7 and above.
// As an alternative, Response.Redirect could be used instead.
// Server.Transfer does not work (see https://support.microsoft.com/en-us/kb/320439 )
Server.TransferRequest("~/Error?Message=" + exception.Message);
}
}
Trình điều khiển lỗi:
/// <summary>
/// This controller exists to provide the error page
/// </summary>
public class ErrorController : Controller
{
/// <summary>
/// This action represents the error page
/// </summary>
/// <param name="Message">Error message to be displayed (provided via querystring parameter - a design choice)</param>
/// <returns></returns>
public ActionResult Index(string Message)
{
// We choose to use the ViewBag to communicate the error message to the view
ViewBag.Message = Message;
return View();
}
}
Trang lỗi Xem:
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>My Error</h2>
<p>@ViewBag.Message</p>
</body>
</html>
Không có gì khác liên quan, ngoài việc vô hiệu hóa / xóa filters.Add(new HandleErrorAttribute())
trong FilterConfig.cs
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute()); // <== disable/remove
}
}
Mặc dù rất đơn giản để thực hiện, nhưng một nhược điểm tôi thấy trong cách tiếp cận này là sử dụng chuỗi truy vấn để cung cấp thông tin ngoại lệ cho trang lỗi đích.