没有参数的属性路由约束

时间:2015-07-20 20:32:34

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

我想用一个简单的约束在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() {}

不起作用

2 个答案:

答案 0 :(得分:0)

属性路由允许应用以下约束,并通过此格式{parameter:constraint}使用,例如[Route(" Index / {id:int}")]。所以你的属性应该是[Route(" Home / {Index:UserAgent(Chrome)}")]

  • {x:alpha}
  • {x:bool}
  • {x:datetime}
  • {x:decimal}
  • {x:double}
  • {X:浮子}
  • {x:guid}
  • {x:int}
  • {x:length()}
  • {x:long}
  • {x:max()}
  • {X:最大长度()}
  • {x:min()}
  • {x:minlength()}
  • {x:range()} {x:regex()}

答案 1 :(得分:0)

查看aspnetmvc源代码,有用,请尝试查看

RouteContraintAttribute,AreaAttribute和RouteAttribute

例如RouteConstraintAttribute:

https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNet.Mvc.Core/RouteConstraintAttribute.cs

我试图弄清楚如何做到这一点。