ASP.NET Core 路由约束是用来限制路由匹配一组url,可以 在路由模板中 完成,在路由模板中可以使用不同类型的路由约束和规则
我们通过例子了解这个知识点
1 Int 路由约束
在MVC应用程序Program.cs类添加下面路由:
我们在id参数上应用了Integer路由约束,这告诉dotnet匹配url中id参数是int类型
为了测试这个int约束是如何工作的,在项目的HomeController添加check方法:
现在创建Check视图在Home->Check文件夹,Check视图代码如下,这个视图显示ViewBag变量的值,该变量保存了客户自定义段Id的值
现在请求URL - http://localhost:7004/Home/Check/Hello,我们将看到状态:404;Not Found 在浏览器(如下图所示)
现在请求url- http://localhost:7004/Home/Check/100 这次我们提供了一个int类型为100的值给id参数,因此路由约束获得匹配, 这个视图将显示-Id Value is:100 ,如下图显示:
在上面路由我们能在int后面添加?,指定路由 第三段可以接受null值 ,下面路由约束告诉ASP.NET Core 匹配URL要么是null要么是int值针对第三段
2 Range 路由约束
当int类型的url段位于在指定的范围内Range约束能使用匹配, 下面路由,我使用了Range 约束:
因此,他将匹配url像:
他不能匹配url像:
3 路由约束
下面表给出一些常用的约束
约束 | 描述 |
int | 匹配int值 |
float | 匹配float值 |
decimal | 匹配decimal值 |
datetime | 匹配datetime值 |
double | 匹配double值 |
bool | 匹配true或者false |
length(len) | 匹配值通过使用len指定数量 |
length(min,max) | 匹配值的长度在min和max(包含最小和最大值) |
max(val) | 匹配int的值少于val |
min(val) | 匹配int的值大于val |
range(min,max) | 匹配int的值在min和max之间 (包含最小值和最大值) |
alpha | 匹配仅仅包含字母(A-Z, a-z) |
regex | 匹配值通过正则表达式定义 |
4 Regex 路由约束
Regex路由约束使用正则表达式匹配url,相比别的约束具有更好灵活性,我们能使用正则表达式创建不同的规则,我们在下面路由中使用了正则表达式, 针对controller参数
这个路由将会匹配url的第一个参数段并且使用字母H开始, 我们采用另外正则约束例子,修改路由如下:
在这个路由中,在url中对controller和action段使用了约束,controller段指定必须H字母开始
action 段指定action段要么是Index要么是About, 因此 如果我打开url- https://localhost:7004/Home/Check/100 ,不能匹配到对应的action方法, 因此我们会获取到404错误
下面url将被匹配:
下面url不会被匹配:
5 组合使用路由约束
我们也可以通过使用:符号将路由约束组合在一起使用,看下面路由,我们联合使用alpha和regex约束, 这意味着id段要么匹配null 要么匹配下面两者:
1 H 字 母 开 始
2 由于alpha约束, 只能使用字母(A-Z, a-z)
url 将匹配下面:
url不会匹配下面地址:
6 自定义路由约束
我们能够创建自定义约束用来满足我们客户所需要的特殊场景, 让我们通过一个例子来理解客户自定义约束
例子:有名字列表 如"Shiv"、"Vishnu"、"Ram"、"Krishn"等,这里我们创建一个路由匹配 ,当下面6个神的名字针对id段的值
创建自定义约束,根据下面步骤:
1 在应用程序中创建一个文件,名字为CustomConstraint,你可以选择任何你喜欢的名字
2 在文件夹内创建一个类,名字为OnlyGodsConstraint,代码如下:
创建一个自定义约束,该类继承自IRouteConstraint接口,IRouteConstraint接口定义匹配的方法并且这个方法决定是否匹配url
这个方法有下列参数:
httpContext – 包含HTTP请求信息
router – 路由
routeKey – 约束的段
RouteValueDictionary – 段变量
routeDirection – 路由方向 (入 或者 出)
在这个方法中,我们使用routeKey对象能够获取id段的值,并且检查是否包含我们列表中的名字,如果列表中包含相应名称将返回true
最后一件事情,在路由中使用这个约束,因此我们需要做一些配置在Program.cs类
varbuilder = WebApplication.CreateBuilder(args); // Add services to the container.builder.Services.AddControllersWithViews;builder.Services.Configure<RouteOptions>(options =>options.ConstraintMap.Add( "allowedgods", typeof(OnlyGodsConstraint)));
varapp = builder.Build; // Configure the HTTP request pipeline.if(!app.Environment.IsDevelopment) {app.UseExceptionHandler( "/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts;}app.UseHttpsRedirection;app.UseStaticFiles;
app.UseRouting;
app.UseAuthorization;
# regionInt约束 //app.MapControllerRoute(// name: "default",// pattern: "{controller=Home}/{action=Index}/{id:int}");# endregion
# region范围约束 //app.MapControllerRoute(// name: "rangeConstraint",// pattern: "{controller=Home}/{action=Index}/{id:range(5,20)?}");# endregion
# region路由正则约束 //app.MapControllerRoute(// name: "regexConstraint",// pattern: "{controller:regex(^H.*)=Home}/{action=Index}/{id?}");
//app.MapControllerRoute(// name: "regexConstraint",// pattern: "{controller:regex(^H.*)=Home}/{action:regex(^Index$|^About$)=Index}/{id?}");# endregion
# region组合路由约束 //app.MapControllerRoute(// name: "combiningConstraint",// pattern: "{controller=Home}/{action=Index}/{id:alpha:regex(^H.*)?}");# endregion
# region客户自定义约束 app.MapControllerRoute(name: "customerConstraint", pattern: "{controller=Home}/{action=Index}/{id:allowedgods}");# endregion
app.Run;
我们告诉asp.net core 路由,我们创建自定义约束并且使用allowedgods名字添加到路由字典中
我们对id参数使用这个约束,像 - {id:allowedgods}, 我们做个测试,运行程序进入https://localhost:7228/Home/Check/Shiv ,我们将看到Id值 在浏览器中Shiv, 图片如下:
现在,进入- http://localhost:7004/Home/Check/Biden,列表中没有发现Biden,所以不会匹配该URL,我们将获取到404错误
总结:
在这节中,我们学习ASP.NET Core 中的路由约束
源代码地址
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.Route/AspNetCore.RouteConstraint
参考文献
[1]https://www.yogihosting.com/aspnet-core-route-constraint/返回搜狐,查看更多
责任编辑: