ASP.NET MVC动态路由与默认控制器/操作相同

时间:2011-03-14 16:00:56

标签: asp.net-mvc asp.net-mvc-routing

我需要路由来匹配有时控制器,有时候 - 数据库值。这是一个例子:

/ controller / action?id = test - 这是默认的{controller} / {action} route

/ name / type?flag = test - 这是我的自定义{dbvalue} / {dbvalue}路径

如您所见,这两条路线是相同的。但是如果{controller}或{action}是一个特定的值(仅在运行时已知,因为它依赖于DB) - 我需要路由匹配我的其他路由(即/ specificcontroller / handleall(字符串名称,字符串类型)操作)。

有可能吗?

2 个答案:

答案 0 :(得分:1)

好的,答案是实现IRouteConstraint从默认路由中接受的{controller}值中排除DB值。

E.g。

 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") }
        );

当然排除的值必须是动态的。

诀窍不是为我的路线添加约束,而是从默认路线中排除这些值。

答案 1 :(得分: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", ...)方法。

通过这种方式,任何请求都将首先匹配DbRouteRouteController将检查db值,如果不匹配,只需将路由转发到Default并基于此呈现视图的控制器/动作