2008-11-25 92 views
14

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

不幸的是,似乎“默认”路线总是首先捕获“等等”。事实上,我已经能够到达“错误”路线的唯一路线是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" } 
     ); 

谢谢 杰夫

回答

2

MVC路线,它们的输入顺序检查。

Mysite/blah将被默认路由找到。控制器将是无用的,而动作是索引。

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

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

+0

谢谢,这是我所了解的理解,但只是不想接受根据我所看到的和我所期望的。但我会学会处理它。 – 2008-11-25 23:07:05

5

为了处理错误,我使用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)); 
    } 
} 
+0

这是做异常处理的错误地方,而且你也通过吹除异常来改变异常的含义。这可能会使调试非常非常困难。 – 2009-05-27 05:21:46

+1

我不明白为什么使用Application_Error处理程序会使调试变得困难。如果您记录异常,您将拥有完整的堆栈跟踪。 * catchall路由的另一个问题是,如果控制器操作发生异常,它将不会被调用,所以如果你想处理500个错误,你需要在其他地方执行。我更喜欢在一个地方有所有的异常处理代码。 – 2009-05-27 07:05:14

+0

最大的问题是,在错误进入Application_Error时(例如会话对象),您会损失大量上下文,并且如果不考虑这些事情,那么调试将变成一场噩梦。 – 2010-10-02 00:33:34

6

你的第一条路线会赶上最网址,因为你必须为元素的默认值,你可以在此使用路由可视化从菲尔哈克调试器,看到链接:

Route Debugger

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,但没有对路由进行此修改。