从默认路由C#MVC中排除控制器

时间:2014-10-09 18:15:38

标签: c# regex asp.net-mvc asp.net-mvc-routing

我想阻止路由处理我的一个控制器,称为MyController

我认为这可能有用,但它没有:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{urlId}",
    defaults: new { controller = "Home", action = "Index", urlId = UrlParameter.Optional },
    constraints: new { controller = @"^(!?MyController)$" }
);

可悲的是,它阻止我导航到我的任何控制器。

如果控制器使用MyController包含(!?MyController.*),我只能让它不匹配,但这并不完全匹配。

我尝试过的所有正则表达式测试人员都认为它只能匹配完全 MyController

1 个答案:

答案 0 :(得分:7)

在此处找到http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints

创建要在约束中使用的NotEqual类

public class NotEqual : IRouteConstraint
{
  private string _match = String.Empty;

  public NotEqual(string match)
  {
    _match = match;
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return String.Compare(values[parameterName].ToString(), _match, true) != 0;
  }
}

然后在RouteConfig中使用该类

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