MVC3 HandleError不显示错误页面

时间:2011-05-10 08:35:48

标签: c# asp.net asp.net-mvc-3

我一直在关注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没有显示。当错误发生时我得到的只是黄色的死亡屏幕说:

Error 显然,将模式设置为“Off”或“RemoteOnly”并不能解决问题。

任何人都知道为什么这不起作用?


修改

如果我直接浏览http://localhost:3527/Account/Index,我会得到正确的ErasErrorPage,但我不希望这样。我希望网站在某处抛出异常时自动重定向到该页面。这可能吗?


EDIT2

我已将[HandleError(View="ErasErrorPage")]属性放在每个Public ActionResult methodName() { ... }方法之前,我仍然得到黄色死亡屏幕,说我需要将模式更改为“关闭”或“RemoteOnly”。 ..

3 个答案:

答案 0 :(得分:3)

确保ErasErrorPage视图本身不会抛出异常。以下是我所做的步骤,对我来说效果很好:

  1. 使用默认的Visual Studio向导
  2. 创建一个新的ASP.NET MVC 3项目
  3. 使用以下内容添加~/Views/Shared/ErasErrorPage.cshtml

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>ErasErrorPage</title>
    </head>
    <body>
        <div>
            OOPS
        </div>
    </body>
    </html>
    
  4. 将HomeContoller修改为如下所示:

    public class HomeController : Controller
    {
        [HandleError(View = "ErasErrorPage")]
        public ActionResult Index()
        {
            throw new Exception("oops");
        }
    }
    
  5. 在web.config中输入:

    <customErrors mode="On" />
    
  6. 导航至/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>