2014-03-26 116 views
6

有什么办法我可以匹配:.NET MVC路由 - catchall在路由启动?

/a/myApp/Feature 

/a/b/c/myApp/Feature 

/x/y/z/myApp/Feature 

与不知道具体是对myApp /功能之前的路径是什么路线?

我基本上想要做的是:

RouteTable.Routes.MapRoute(
    "myAppFeatureRoute", "{*path}/myApp/Feature", 
    new { controller = "myApp", action = "Feature" }); 

,但你不能把一个包罗万象的在路线的起点。

如果我只是尝试 “{}路径/对myApp /功能”,这将匹配 “/ A /对myApp /功能”,而不是 “/ A/B/C /对myApp /功能”。

我尝试了正则表达式包罗万象的好,那什么也没做,以帮助。

RouteTable.Routes.MapRoute(
    "myAppFeatureRoute", "{path}/myApp/Feature", 
    new { controller = "myApp", action = "Feature", path = @".+" }); 

的原因,我这样做是我建立了在一个CMS使用的功能,并且可以在网站结构的任何地方坐 - 我只能是某些关于路径的终点,不开始。

回答

7

您可以使用一个约束,

public class AppFeatureUrlConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (values[parameterName] != null) 
     { 
      var url = values[parameterName].ToString(); 
      return url.Length == 13 && url.EndsWith("myApp/Feature", StringComparison.InvariantCultureIgnoreCase) || 
        url.Length > 13 && url.EndsWith("/myApp/Feature", StringComparison.InvariantCultureIgnoreCase); 
     } 
     return false; 
    } 
} 

用它作为,

routes.MapRoute(
    name: "myAppFeatureRoute", 
    url: "{*url}", 
    defaults: new { controller = "myApp", action = "Feature" }, 
    constraints: new { url = new AppFeatureUrlConstraint() } 
    ); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

那么下面的网址应该Feature行动

/a/myApp/Feature 

/a/b/c/myApp/Feature 

/x/y/z/myApp/Feature 

希望被截获这有助于。

+0

谢谢!我不知道你可以做到这一点。效果很好! –

+0

不客气。 – shakib