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

发布于 2024-10-22 01:01:47 字数 339 浏览 1 评论 0原文

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

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

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

如您所见,两条路线相同。但是,如果 {controller} 或 {action} 是特定值(仅在运行时知道,因为它取决于数据库) - 我需要路由来匹配我的其他路由(即 /speciccontroller/handleall(string name, string type) action)。

是否可以?

I need routes to match sometimes controllers, and sometimes - database values. Here's an example:

/controller/action?id=test - this is the default {controller}/{action} route

/name/type?flag=test - this is my custom {dbvalue}/{dbvalue} route

As you can see, the two routes are the same. But if {controller} or {action} is a specific value (only known at runtime because it depends on DB) - I need the route to match my other route (i.e. /specificcontroller/handleall(string name, string type) action).

Is it possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愁以何悠 2024-10-29 01:01:47

好的,答案是实现 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") }
        );

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

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

OK, the answer would be to implement IRouteConstraint to exclude DB values from the {controller} values accepted in the default route.

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

Of course excluded values have to be dynamic.

The trick was not to add constraints to my route, but to exclude the values from the default route.

情泪▽动烟 2024-10-29 01:01:47

这尚未经过测试,只是一个想法:

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

然后在类 RouteController 内的方法操作 Index() 中,检查 dbValue1dbValue2。如果不匹配,您可以使用 RedirectToRoute("Default", ...) 方法。

通过这种方式,任何请求都会首先匹配DbRouteRouteController将检查db值,如果不匹配,只需将路由转发到Default并根据控制器/操作渲染视图。

This is not tested yet but just an idea:

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

then in method action Index() inside class RouteController, you check for the dbValue1 and dbValue2. If not match, you can use RedirectToRoute("Default", ...) method.

By this way, any request will match DbRoute first and RouteController will check for the db value, if not match simply forward the route to the Default and render the view based on controller/action.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文