我一直在关注HandleError属性的指南: blogs.msdn.com 我这样使用(AccountController):
[HandleError(View="ErasErrorPage")]
public ActionResult Index()
{
ViewBag.admins = _accountMapper.GetAdmins(false);
ViewBag.members = _accountMapper.GetMembers(false);
ViewBag.Countries = _countryMapper.GetCountries();
return View();
}
此代码抛出异常,因为_accountMapper.GetAdmins(false)
因System.Data.EntityException而失败。
我已将ErasErrorPage视图放在我的Shared文件夹中,并且我添加了<customErrors mode="On"/>
但是ErasErrorPage没有显示。当错误发生时我得到的只是黄色的死亡屏幕说:
显然,将模式设置为“Off”或“RemoteOnly”并不能解决问题。
任何人都知道为什么这不起作用?
修改
如果我直接浏览http://localhost:3527/Account/Index,我会得到正确的ErasErrorPage,但我不希望这样。我希望网站在某处抛出异常时自动重定向到该页面。这可能吗?
EDIT2
我已将[HandleError(View="ErasErrorPage")]
属性放在每个Public ActionResult methodName() { ... }
方法之前,我仍然得到黄色死亡屏幕,说我需要将模式更改为“关闭”或“RemoteOnly”。 ..
答案 0 :(得分:3)
确保ErasErrorPage
视图本身不会抛出异常。以下是我所做的步骤,对我来说效果很好:
使用以下内容添加~/Views/Shared/ErasErrorPage.cshtml
:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>ErasErrorPage</title>
</head>
<body>
<div>
OOPS
</div>
</body>
</html>
将HomeContoller修改为如下所示:
public class HomeController : Controller
{
[HandleError(View = "ErasErrorPage")]
public ActionResult Index()
{
throw new Exception("oops");
}
}
在web.config中输入:
<customErrors mode="On" />
导航至/Home/Index
=&gt;自定义错误页面按预期显示
答案 1 :(得分:3)
由于这根本不起作用,我找到了一个很好的选择:
Custom error pages on asp.net MVC3
我也发现了它失败的原因:
在尝试渲染视图之前,我们尝试连接到数据库。 HandleError属性甚至不会被触发(我认为)。上面的方法确实这样做了。它可以在任何地方处理任何异常。
答案 2 :(得分:1)
它确实有效,我有一个带有属性[HandleError(View = "Error")]
的BaseController和一个与动态模型共享的错误视图(应该是HandleErrorInfo
)并且在HomeController的Index操作中我扔了一个例外:
throw new Exception("Test exception");
然后呈现错误视图并显示正确的信息。
ErrorView:
<div class="errorMessage">
<h1 class="errorHeader">@Model.Exception.GetType().Name</h1>
<cite class="errorAction">thrown in @Model.ControllerName @Model.ActionName</cite>
<p class="errorMessage">thrown in @Model.Message</p>
</div>