2015-07-20 73 views
1

我想創建屬性在MVC 5應用一個簡單的約束路由:屬性佈線約束不帶參數

public class UserAgentConstraint : IRouteConstraint 
{ 
    private string _requiredUserAgent; 

    public UserAgentConstraint(string requiredUserAgent) 
    { 
     _requiredUserAgent = requiredUserAgent; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, 
     string parameterName, RouteValueDictionary values, 
     RouteDirection routeDirection) 
    { 
     return httpContext.Request.UserAgent != null && 
       httpContext.Request.UserAgent.Contains(_requiredUserAgent); 
    } 
} 

在MVC 4我能以這種方式來註冊它:

routes.MapRoute("ChromeRoute", "{*catchall}", 
    new { controller = "Home", action = "Index" }, 
    new { customConstraint = new UserAgentConstraint("Chrome") }); 

我怎樣才能達到相同的結果使用只有屬性路由? 我知道我可以這樣註冊約束:

var constraintsResolver = new DefaultInlineConstraintResolver(); 
constraintsResolver.ConstraintMap.Add("UserAgent", typeof(UserAgentConstraint)); 

但如何將它添加到我的路由模式?是這樣的:

[Route("Home/Index:UserAgent(Chrome)")] 
public ActionResult Index() {} 

不工作

回答

0

屬性路由允許施加以下約束,並通過此格式{參數:約束}用於例如〔路線(「索引/ {ID:INT}」 )]。所以,你的屬性應該是[路線( 「首頁/ {指數:用戶代理器(Chrome)}」)]

  • {X:阿爾法}
  • {X:布爾}
  • {X:日期時間}
  • {X:十進制}
  • {X:雙}
  • {X:浮子}
  • {X:GUID}
  • {X:整數}
  • {X:長度()}
  • {X:長}
  • {X:MAX()}
  • {X:最大長度()}
  • {X:分鐘()}
  • { X:使用MINLENGTH()}
  • {X:範圍()} {X:正則表達式()}
+0

此外,嘗試添加約束後調用此方法 routes.MapMvcAttributeRoutes(constraintsResolver); – Kristofor

+0

不幸的是,索引操作中沒有任何參數。我很想通過客戶約束的整個行動,而不僅僅是選定的參數(我沒有) –

+0

什麼是試圖完成?您是否試圖在別處路由或阻止用戶訪問特定的用戶代理?也許一個動作過濾器會更適合。 – Kristofor