处理ASP.NET MVC中的路由错误

Maj*_*ons 7 asp.net-mvc routes

我理解如何设置自己的路由,但是如何处理路由表中的路径呢?我的意思是,我猜默认{controller}/{action}/{id}路线可能是一个通用的捕获,但我不确定这是不是可行的方法.我喜欢让我的用户知道他们已经请求了数据/不存在的"页面".

这是[HandleError]过滤器进来的地方吗?这究竟是如何运作的?

Mar*_*erl 8

如果找不到您的路由,您希望将其作为正常的HTTP 404错误处理.

如果只将[HandleError]属性添加到类或操作中,MVC将Error在视图文件夹中查找视图.

您还可以添加一个ErrorController甚至是静态页面并将其添加到您的Web.config:

<customErrors mode="On" >
    <error statusCode="404" redirect="/Error/PageNotFound/" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

或者您可以处理您的HTTP 404 Global.asax.cs并以ErrorController编程方式路由到.这就是我通常这样做的方式:

protected void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError().GetBaseException();

    var routeData = new RouteData();

    if (ex.GetType() == typeof(HttpException))
    {
        var httpException = (HttpException)ex;

        switch (httpException.GetHttpCode())
        {
            case 404:
                routeData.Values.Add("action", "PageNotFound");
                break;
            default:
                routeData.Values.Add("action", "GeneralError");
                break;
        }
    }
    else
    {
        routeData.Values.Add("action", "GeneralError");
    }

    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("error", ex);

    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
Run Code Online (Sandbox Code Playgroud)