2014-10-09 46 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