快速回答/ TL
对于那些懒惰的人:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
然后从global.asax中删除这一行
GlobalFilters.Filters.Add(new HandleErrorAttribute());
这仅适用于IIS7+和IIS Express。
如果你用卡西尼号…嗯. .嗯. .呃. .尴尬……
冗长的解释
我知道这个问题已经得到了回答。但答案真的很简单(为大卫·福勒和达米安·爱德华兹真正回答了这个问题而欢呼)。
没有必要做任何定制。
ASP。NET MVC3,所有的片段都在那里。
更新你的网页。在两个点配置。
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
and
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
现在仔细记下我决定使用的路线。你可以用任何方法,但我的路线
/NotFound <-表示404未找到,错误页面。
/ServerError <-对于任何其他错误,包括在我的代码中发生的错误。这是一个500内部服务器错误
请参阅<system. >中的第一部分。Web >只有一个自定义条目?statusCode="404"条目?我只列出了一个状态码,因为所有其他错误,包括500服务器错误(即。当你的代码有bug并使用户的请求崩溃时发生的那些讨厌的错误)。所有其他错误都通过设置defaultRedirect="/ServerError"来处理。上面说,如果你没有404页面没有找到,那么请转到route /ServerError。
好的。那太离谱了。现在到global.asax中列出的路由
步骤2 -在Global.asax中创建路由
这是我的完整路线部分。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
它列出了两个忽略路由-> axd's和favicons(哦!奖励忽略路线,为你!)
然后(这里的顺序是IMPERATIVE),我有两个显式的错误处理路由..然后是其他路线。在本例中,是默认值。当然,我还有更多,但那是我网站的特色。只要确保错误路由位于列表的顶部即可。秩序是必须的。
最后,当我们在全局变量中。asax文件,我们不全局注册HandleError属性。不,不,不,先生。没有。年兽。负的。Noooooooooo……
从global.asax中删除这一行
GlobalFilters.Filters.Add(new HandleErrorAttribute());
步骤3 -用动作方法创建控制器
现在. .我们添加了一个带有两个动作方法的控制器…
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
好的,我们来看看这个。首先,这里没有[HandleError]属性。为什么?因为内置的ASP。NET框架已经在处理错误,并且我们已经指定了处理错误所需的所有屁事:)它就在这个方法中!
接下来,我有两个动作方法。没什么难的。如果你想显示任何异常信息,那么你可以使用Server.GetLastError()来获取该信息。
奖励WTF:是的,我做了第三个动作方法,以测试错误处理。
步骤4 -创建视图
最后,创建两个视图。把它们放到这个控制器的正常视图点。
奖金的评论
你不需要一个Application_Error(对象发送器,EventArgs e)
以上步骤对Elmah来说都是100%完美的。该死的埃尔玛!
朋友们,就这样吧。
现在,祝贺你读了这么多,并有一个独角兽作为奖品!