【问题标题】:ASP.NET MVC dynamic route that is same as default controller/action与默认控制器/动作相同的 ASP.NET MVC 动态路由
【发布时间】:2011-07-15 03:25:09
【问题描述】:

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

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

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

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

有可能吗?

【问题讨论】:

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


    【解决方案1】:

    这还没有测试,只是一个想法:

    全球.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 并根据 controller/action 渲染视图

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-04
        • 2012-08-14
        • 1970-01-01
        • 2010-12-15
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多