16

我似乎无法弄清楚这一点。我正在尝试使用 MVC Beta 并尝试实现一个包罗万象的路由,这样如果用户输入 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

4 回答 4

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));
    }
}
于 2008-11-25T22:17:43.817 回答
6

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

路由调试器

于 2008-11-25T23:18:33.037 回答
3

MVC 路由按照它们输入的顺序进行检查。

Mysite/blah 将通过默认路由找到。控制器是废话,动作是索引。

当您输入 mysite/blah/blah/blah/blah 路由时,您给了它一个无法将默认路由映射到的路由,然后调用了您的包罗万象的路由。

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

于 2008-11-25T22:08:05.707 回答
0

这在处理 MVC 包罗万象的问题时也有帮助:

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

也就是说,在它说的地方{id},将其更改为{*id}。这允许最终的 id 参数使用尽可能多的附加路径。默认规则接受这个:

/人/姓名/乔

但不是这个:

/产品/列表/排序/名称

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

于 2012-06-25T06:56:28.853 回答