MVC 避免黄页
可以使用HandleErrorAttribute
有两种方式可以使用它,在类或者方法的头上加 [HandleError]
这种直接在类或者方法上加[HandlerError]手动添加
另外一种方式是使用Global Filters功能来注册,默认的mvc3.0以上都在Global.asax文件已经默认在新建的mvc项目的这个文件已经添加
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //整个程序所有控制器都使用HandlerError来处理错误 //不过它只处理500系列错误,404类型需要单独处理 filters.Add(new HandleErrorAttribute()); }
下一步:需要开启根目录的web.config下customErrors节点(是根目录,不是views目录下的web.config)
在web.config文件的 <system.web>节点里:
<customerrors mode="On" defaultredirect="~/Error/HttpError">
<error redirect="~/Error/NotFound" statuscode="404" />
</customerrors>
注意:defaultredirect 定义的是所有错误页面转向的错误页面地址,而error 节点元素就是单独定义不同的错误页面转向地址,上面的error行就是定义的404类型转向的地址
最后一件事:定义具体错误页面ErrorController
public class ErrorController : Controller { public ActionResult HttpError() { return View("Error"); } public ActionResult NotFound() { return View(); } public ActionResult Index() { return RedirectToAction("Index", "Home"); } }
可以修改~/Views/Shared/Error.cshtml
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "General Site Error";
}
<h2>A General Error Has Occurred</h2>
@if (Model != null)
{
<p>
@Model.Exception.GetType().Name<br />
thrown in @Model.ControllerName @Model.ActionName
</p>
<p>Error Details:</p>
<p>@Model.Exception.Message</p>
}
另外也可以通过传递参数来重写GlobalFilter里的HandleErrorAttribte注册,单独声明一个特定的Exception,并且带有Order参数,当然也可以连续声明多个,这样就会多次处理。
例如:
//也可以通过传递参数来重写GlobalFilter里的HandleErrorAttribte注册,单独声明一个特定的Exception,并且带有Order参数,当然也可以连续声明多个,这样就会多次处理
filters.Add(new HandleErrorAttribute()
{
Order = 2,
//这个view是shared目录下的view,表示通用共享
View = "OtherView",
ExceptionType = typeof(YourExceptionHere)
});