Microsoft.AspNetCore.Routing Constraints 内置一下约束情况
routes.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index", }, constraints: new { id = new IntRouteConstraint() });
也可以这样写
constraints: new { lastName = new RegexRouteConstraint(new Regex("[a-zA-Z]{3}", RegexOptions.CultureInvariant, RegexMatchTimeout))
routes.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index", }, constraints: new { // 可以同时添加多个路由约束 id = new CompositeRouteConstraint( new IRouteConstraint[] { new IntRouteConstraint(), new MinRouteConstraint(0) }) });
同时我们可以自己定义路由约束IRouteConstraint 继承此接口
public void ConfigureServices(IServiceCollection services) { services.Configure<RouteOptions>(options=> { //通过路由routeoptions的ConstraintMap添加新的路由约束即可因为默认系统加载时候已经创建原始的路由约束 options.ConstraintMap.Add("even",typeof(EvenRouteConstraint)); }); // Add framework services. services.AddMvc(); }
Microsoft.AspNetCore.Routing.RouteOptions 源代码方法中已经默认加载了这些路由约束
private static IDictionary<string, Type> GetDefaultConstraintMap()
{
return new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase)
{
// Type-specific constraints
{ "int", typeof(IntRouteConstraint) },
{ "bool", typeof(BoolRouteConstraint) },
{ "datetime", typeof(DateTimeRouteConstraint) },
{ "decimal", typeof(DecimalRouteConstraint) },
{ "double", typeof(DoubleRouteConstraint) },
{ "float", typeof(FloatRouteConstraint) },
{ "guid", typeof(GuidRouteConstraint) },
{ "long", typeof(LongRouteConstraint) },
// Length constraints
{ "minlength", typeof(MinLengthRouteConstraint) },
{ "maxlength", typeof(MaxLengthRouteConstraint) },
{ "length", typeof(LengthRouteConstraint) },
// Min/Max value constraints
{ "min", typeof(MinRouteConstraint) },
{ "max", typeof(MaxRouteConstraint) },
{ "range", typeof(RangeRouteConstraint) },
// Regex-based constraints
{ "alpha", typeof(AlphaRouteConstraint) },
{ "regex", typeof(RegexInlineRouteConstraint) },
{"required", typeof(RequiredRouteConstraint) },
};
}
.NetCore MVC中内建了大量的约束可供使用。其中大多数基于类型的约束都是使用该类型的TryParse()来尝试转换变量提取出来的字符串,返回ture则通过约束,返回false违反约束。
1.约束为int:int,对应的类为IntRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:int }”
2.约束为float:float,对应的类为FloatRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:float }”
3.约束为long:long,对应的类为LongRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:long}”
4.约束为double:double,对应的类为DoubleRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:double }”
5.约束为decimal:decimal,对应的类为DecimalRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:decimal }”
6.约束为布尔值:bool,对应的类为BoolRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:bool}”
7.约束为字母:alpha,对应的类为AlphaRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:alpha}”
8.约束为时间日期:datetime,对应的类为DateTimeRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:datetime}”
9.约束为GUID:guid,对应的类为GuidRouteConstraint
例子:”{controller=Home}/{action=Index}/{id:bool}”
10.约束长度:length(len),对应的类为LengthRouteConstraint(len)
例子:”{controller=Home}/{action=Index}/{id:length(5) }”
11.约束最小长度:minlength(len),对应的类为MinLengthRouteConstraint(len)
例子:”{controller=Home}/{action=Index}/{id:minlength(5)}”
12.约束最大长度:maxlength(len),对应的类为MaxLengthRouteConstraint(len)
例子:”{controller=Home}/{action=Index}/{id:maxlength(10)}”
13.约束长度范围:length(min,max),对应的类为LengthRouteConstraint(min,max)
例子:”{controller=Home}/{action=Index}/{id:length(5,10)}”
14.约束最小值:min(v),对应的类为MinRouteConstraint(v)
例子:”{controller=Home}/{action=Index}/{id:min(0)}”
15.约束最大值:max(v),对应的类为MaxRouteConstraint(v)
例子:”{controller=Home}/{action=Index}/{id:max(1000)}”
16.约束范围:range(min,max),对应的类为RangeRouteConstraint(min,max)
例子:”{controller=Home}/{action=Index}/{id:range(0,1000) }”
17.约束正则表达式:regex(exp),对应的类为RegexRouteConstraint(exp)
例子:”{controller:regex(^My.*)=Home }/{action=Index}/{id?}”