ASP.NET Core 路由约束

 

目录

1 Int 路由约束

2 Range 路由约束

3 路由约束

4 Regex 路由约束

5 组合使用路由约束

6 自定义路由约束

总结

参考文献


ASP.NET Core 路由约束是用来限制路由匹配一组url,可以在路由模板中完成,在路由模板中可以使用不同类型的路由约束和规则

我们通过例子了解这个知识点

1 Int 路由约束

在MVC应用程序Program.cs类添加下面路由:


app.MapControllerRoute(
    name: "intConstraint",
    pattern: "{controller=Home}/{action=Index}/{id:int}");

我们在id参数上应用了Integer路由约束,这告诉dotnet匹配url中id参数是int类型

为了测试这个int约束是如何工作的,在项目的HomeController添加check方法:​​​​​​​


public IActionResult Check(string id)
{
    ViewBag.ValueofId = id ?? "Null Value";
    return View();
}

现在创建Check视图在Home->Check文件夹,Check视图代码如下,这个视图显示ViewBag变量的值,该变量保存了客户自定义段Id的值​​​​​​​

<h1>'Home' Controller, 'Check' View</h1>
<h2>Id value is: @ViewBag.ValueofId</h2>

现在请求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值针对第三段​​​​​​​

app.MapControllerRoute(
    name: "intConstraint",
    pattern: "{controller=Home}/{action=Index}/{id:int?}");

2 Range 路由约束

当int类型的url段位于在指定的范围内Range约束能使用匹配,下面路由,我使用了Range 约束:​​​​​​​


app.MapControllerRoute(
    name: "rangeConstraint",
    pattern: "{controller=Home}/{action=Index}/{id:range(5,20)?}");

因此,他将匹配url像:​​​​​​​

/Home/Index
/Admin/List/5
/Home/List/15
/Home/List/20

他不能匹配url像:​​​​​​​


/Home/Index/3
/Home/Index/Hello
/Home/Index/21

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参数​​​​​​​


app.MapControllerRoute(
    name: "regexConstraint",
    pattern: "{controller:regex(^H.*)=Home}/{action=Index}/{id?}");

这个路由将会匹配url的第一个参数段并且使用字母H开始,我们采用另外正则约束例子,修改路由如下:​​​​​​​

app.MapControllerRoute(
    name: "regexConstraint",
    pattern: "{controller:regex(^H.*)=Home}/{action:regex(^Index$|^About$)=Index}/{id?}");

在这个路由中,在url中对controller和action段使用了约束,controller段指定必须H字母开始

action 段指定action段要么是Index要么是About, 因此 如果我打开url- https://localhost:7004/Home/Check/100 ,不能匹配到对应的action方法,因此我们会获取到404错误

下面url将被匹配:​​​​​​​


/
/Home/Index
/Home/About/
/Home/Index/2
/Home/About/3

下面url不会被匹配:​​​​​​​


Edit/Index/3
/Home/List

5 组合使用路由约束

我们也可以通过使用:符号将路由约束组合在一起使用,看下面路由,我们联合使用alpha和regex约束,这意味着id段要么匹配null 要么匹配下面两者:

1 H 字 母 开 始

2 由于alpha约束, 只能使用字母(A-Z, a-z)​​​​​​​

app.MapControllerRoute(
    name: "combiningConstraint",
    pattern: "{controller=Home}/{action=Index}/{id:alpha:regex(^H.*)?}");

url 将匹配下面:​​​​​​​


/Home/Index/Hello
/Home/Index/Hell
/Home/Index
/Home/Check/HelloJackson

url不会匹配下面地址:​​​​​​​


/Home/Index/100
/Home/About/Jackson
/Home/Check/Hello-Jackson

6 自定义路由约束

我们能够创建自定义约束用来满足我们客户所需要的特殊场景,让我们通过一个例子来理解客户自定义约束

例子:有名字列表 如"Shiv"、"Vishnu"、"Ram"、"Krishn"等,这里我们创建一个路由匹配 ,当下面6个神的名字针对id段的值​​​​​​​

1. Ram
2. Shiv
3. Krishn
4. Vishnu
5. Brahma
6. Lakshmi

创建自定义约束,根据下面步骤:

1 在应用程序中创建一个文件,名字为CustomConstraint,你可以选择任何你喜欢的名字

2 在文件夹内创建一个类,名字为OnlyGodsConstraint,代码如下:​​​​​​​


namespace AspNetCore.RouteConstraint.CustomConstraint
{
    public class OnlyGodsConstraint : IRouteConstraint
    {
        private string[] gods = new[] { "Ram", "Shiv", "Krishn", "Vishnu", "Brahma","Lakshmi" };
        public bool Match(HttpContext? httpContext, IRouter? route, 
                          string routeKey, RouteValueDictionary values, 
                          RouteDirection routeDirection)
        {
            return gods.Contains(values[routeKey]);
        }
    }
}

创建一个自定义约束,该类继承自IRouteConstraint接口,IRouteConstraint接口定义匹配的方法并且这个方法决定是否匹配url

这个方法有下列参数:

httpContext – 包含HTTP请求信息

router – 路由

routeKey – 约束的段

RouteValueDictionary – 段变量

routeDirection – 路由方向 (入 或者 出)

在这个方法中,我们使用routeKey对象能够获取id段的值,并且检查是否包含我们列表中的名字,如果列表中包含相应名称将返回true

最后一件事情,在路由中使用这个约束,因此我们需要做一些配置在Program.cs类​​​​​​​


using AspNetCore.RouteConstraint.CustomConstraint;

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.Configure<RouteOptions>(options =>
   options.ConstraintMap.Add("allowedgods", typeof(OnlyGodsConstraint)));

var app = 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();

#region Int约束
//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/

引入地址 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值