2011-03-14 209 views
0

我需要路由來匹配控制器,有時還需要數據庫值。這裏有一個例子:??ASP.NET MVC動態路由與默認控制器/動作相同

/控制器/動作ID =測試 - 這是默認{控制器}/{行動}路線

/名/型號標誌爲測試 - 這是我的自定義{dbvalue}/{dbvalue} route

正如你所看到的,兩條路線是相同的。但是如果{controller}或{action}是一個特定的值(只在運行時才知道,因爲它依賴於DB) - 我需要路由來匹配我的其他路由(即/ specificcontroller/handleall(string name,string type)action)。

可能嗎?

回答

1

好的,答案是實現IRouteConstraint從默認路由中接受的{controller}值中排除DB值。

例如

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

當然排除的值必須是動態的。

技巧是不添加約束到我的路線,但排除默認路由的值。

0

這尚未被測試,但只是一個想法:

的Global.asax:

routes.MapRoute("DbRoute", "{dbValue1}/{dbValue2}", new {controller = "RouteController", action = "Index"}); 
routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional}); 

然後在方法動作Index()RouteController類,你檢查的dbValue1dbValue2。如果不匹配,則可以使用RedirectToRoute("Default", ...)方法。

通過這種方式,任何請求都將匹配DbRoute第一和RouteController將檢查分貝值,如果不匹配簡單地轉發到Default路線和渲染基於控制器/動作的看法。