如何在 .NET MVC 3 中实现正确的 HTTP 错误处理
本文关键字:HTTP 处理 错误 实现 NET MVC | 更新日期: 2023-09-27 18:31:42
我指的是Darin在下面的帖子中的回答。
我正在使用MVC3,我想知道这是否仍然是处理错误的一种方法?
在 rrror 控制器中,他具有以下内容:
public ActionResult Http404()
{
Response.StatusCode = 404;
return Content("404", "text/plain");
}
从他的代码工作..我希望它显示完整的URL,我该怎么做? 所以它需要www.mywebsite.com/Error/Http404
,而不仅仅是www.mywebsite.com
. 我该怎么做? 我以为如果我有以下代码,那么它将显示完整的URL,但它仍然只显示 www.mywebsite.com:
public ActionResult Http404()
{
Response.StatusCode = 404;
return View("Http404");
}
如何获取在 global.asax.cs 中设置的 ex 值以显示在此页面上?
我不再在 web.config 中处理我的错误,因为它保留在查询字符串中有一个 aspxerrorpath。
你试过吗:http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/01/error-handling-and-customerrors-and-mvc3-oh-my.aspx
此示例不会重定向到错误页,但会继续显示发生错误的位置请求的 URL。我希望它能帮助你。
根据我的理解,您希望将用户重定向到异常的特定错误页面,以及要访问异常的错误页面。
这是我尝试过的,创建了一个基本控制器并覆盖了OnException
方法。在OnException
方法中,我正在做您在Global.asax.cs
中尝试的大部分事情。
最重要的是,在处理异常后,我在ExceptionContext
的Result
属性中设置了一个RedirectAction
。
同样要从错误视图中访问Exception
,我将异常存储在TempData
中。从ErrorController
,我将异常作为HandleErrorInfo
实例传递给视图。
这是完整的代码。
// BaseController
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
if (!filterContext.ExceptionHandled)
{
var action = "General";
if (filterContext.Exception is HttpException)
{
var httpException = filterContext.Exception as HttpException;
switch (httpException.GetHttpCode())
{
case 404:
// page not found
action = "Error404";
break;
case 500:
// server error
action = "Error500";
break;
default:
action = "General";
break;
}
}
filterContext.Result = RedirectToAction(action, "error");
TempData["error"] = new HandleErrorInfo(filterContext.Exception,
RouteData.Values["controller"].ToString(),
RouteData.Values["action"].ToString());
filterContext.ExceptionHandled = true;
}
}
}
// Error Controller
public class ErrorController : Controller
{
public ActionResult Error404()
{
return View(TempData["error"] as HandleErrorInfo);
}
// other methods
}
// Sample controller derives from BaseController.
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult NotFound()
{
throw new HttpException(404, "Not Found");
}
}
// Error404.cshtml
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "404 Not Found";
}
<h2>@ViewBag.Title</h2>
<p>
Last Exception: @Model.Exception
</p>
更新:这种方法的一个缺点是我们可以处理HTTP异常404,500或任何仅从控制器操作中抛出的异常。