我需要路由来匹配有时控制器,有时候 - 数据库值。这是一个例子:
/ controller / action?id = test - 这是默认的{controller} / {action} route
/ name / type?flag = test - 这是我的自定义{dbvalue} / {dbvalue}路径
如您所见,这两条路线是相同的。但是如果{controller}或{action}是一个特定的值(仅在运行时已知,因为它依赖于DB) - 我需要路由匹配我的其他路由(即/ specificcontroller / handleall(字符串名称,字符串类型)操作)。
有可能吗?
答案 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
中,检查dbValue1
和dbValue2
。如果不匹配,您可以使用RedirectToRoute("Default", ...)
方法。
通过这种方式,任何请求都将首先匹配DbRoute
,RouteController
将检查db值,如果不匹配,只需将路由转发到Default
并基于此呈现视图的控制器/动作强>