.Net MVC Routing Catchall无效

时间:2008-11-25 21:13:43

标签: asp.net-mvc routing

我似乎无法弄清楚这一点。我正在尝试使用MVC Beta,我正在尝试实现一个catchall路由,这样如果用户输入mysite.com/blah而不是mysite.com/home/index,它将会出现“错误”路径。

不幸的是,“默认”路线似乎总是首先捕捉到“等等”。事实上,我唯一能够进入“错误”路线的路线是blah / blah / blah / blah。

这是它应该工作的方式,因为我已经看到其他示例设置了“默认”和“错误”路由就像这样,似乎如果他们要输入一个没有的控制器如果存在,它会点击“错误”路线。

是否有我缺少的东西(非常可能)或者我是否只需要为每个控制器创建一个特定的路线?

我正在使用的代码:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Error",
            "{*catchall}",
            new { controller = "Base", action = "Error", id = "404" }
        );

谢谢你, 杰夫

4 个答案:

答案 0 :(得分:6)

为了处理错误,我在我的一个项目中使用了Application_Error事件:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "HttpError500");

            if (httpException.GetHttpCode() == 404)
            {
                routeData.Values["action"] = "HttpError404";
            }

        Server.ClearError();
        Response.Clear();
        IController errorController = new ErrorController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}

答案 1 :(得分:6)

你的第一条路线将捕获最多的网址,因为你有元素的默认值,你可以使用Phil Haack的路由调试器将其可视化,请参阅链接:

Route Debugger

答案 2 :(得分:3)

按照输入的顺序检查MVC路由。

默认路线会找到Mysite / blah。控制器将是等等,动作是索引。

当你输入mysite / blah / blah / blah / blah路线时,你给它一条路线,它无法将默认路线映射到,然后调用你的catchall路线。

对于其他示例,您是否注意到他们是否设置了错误过滤器?我很确定默认的asp.net mvc网站已经在页面上有一些错误处理属性。

答案 3 :(得分:0)

这在处理MVC捕获问题时也有帮助:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{*id}",                          // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

也就是说,{id}的位置,将其更改为{*id}。这允许最终的id参数消耗尽可能多的传入路径。默认规则接受:

/人/名称/乔

但不是这样:

/产品/列表/ sortby /名称

第二个URL将抛出404而不对路径进行此修改。