2014-10-09 52 views
3

我想阻止路由处理我的一个控制器,称为MyController从默认路由C#排除控制器MVC

我想这可能会奏效,但它并不:

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

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

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

我试过的所有正则表达式测试者都建议它应该只匹配,正好是MyController

+0

嗨。它是第一个映射的路线。 – Luke 2014-10-09 18:24:49

回答

4

发现这个在这里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") } 
); 
+0

@Coulton就这样你知道,因为MVC是由约定驱动的,所以在大多数你必须指定控制器的地方,你不必输入字控制器,MVC知道要寻找一个预先指定的控制器。 – JB06 2014-10-10 17:56:56

+0

感谢您提供的信息,关于省略控制器位,我有点困惑,在这个例子中该如何工作? – Luke 2014-10-11 08:49:22

+0

@Luke你可以使用'new NotEqual(“我的”)' – 2016-09-15 14:03:26