2015-07-20 82 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