.NetCore之路由的最佳实现

以上只是简单说说特性路由的用法,小伙伴们可以根据实际情况进行标注,当然如果有特殊需求,也可以进行自定义路由特性,只要继承IRouteTemplateProvider接口即可,上面标注的Route和HttpGet特性也是继承于这个接口,把RouteAtrribute的源代码扒出来参考参考:

namespace Microsoft.AspNetCore.Mvc
{
// 标识此特性只能在类和方法上使用
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RouteAttribute : Attribute, IRouteTemplateProvider
{
private int? _order;
// 构造函数,传入一个Url模板参数
public RouteAttribute(string template)
{
Template = template ?? throw new ArgumentNullException(nameof(template));
}

    public string Template { get; }
    // 路由执行顺序,默认为0
    public int Order
    {
        get { return _order ?? 0; }
        set { _order = value; }
    }

    /// 
    int? IRouteTemplateProvider.Order => _order;

    // 路由名称,后续可以根据路由名称生成Url,而不是硬编码编写
    public string Name { get; set; }
}

}
来,自己也搞一个特性路由练练:

img

有没有很简单,其实这里是忍住没去扒代码的,后续单独去扒;用法就先暂时说这么多,接下来说说路由传参和约束。

路由传参和约束

一般情况,会针对路由中动态参数进行约束;从而路由约束可能会被作为输入校验,但是官方不推荐,因为当规则不匹配的时候,返回状态404(找不到),而事实对应地址可以到达请求,只是参数输入不合法而已,所以官方推荐作为消除路由歧义 ,同时也能避免不规则的路由进行业务处理;直接来案例演示(废话多了怕掉坑里):

img

新增的Controller完整代码:

namespace RouteDemo.Controllers
{
[ApiController]
[Route("/api/[controller]")]
public class TestConstraintController
{
///
/// 验证必须输入,没有输入就返回404
///
[HttpGet(“TestRequiredConstraint/{name:required}”)]
public string TestRequiredConstraint(string name)
{
return “TestRequiredConstraint”;
}

    /// 
    /// 整型约束,非整型数据就返回404
    /// 
    [HttpGet("TestValueConstraint/{id:int}")]
    public string TestValueConstraint(int id)
    {
        return "TestValueConstraint";
    }

    /// 
    /// 传入最小值为100,传入值小于100就返回404
    /// 
    [HttpGet("TestMinConstraint/{id:min(100)}")]
    public string TestMinConstraint(int id)
    {
        return "TestMinConstraint";
    }

    /// 
    /// 范围约束8到18,不在这个范围内就返回404
    /// 
    [HttpGet("TestRangeConstraint/{id:range(8,18)}")]
    public string TestRangeConstraint(int id)
    {
        return "TestRangConstraint";
    }

    /// 
    /// 验证最小长度为5,低于这个长度就返回404
    /// 
    [HttpGet("TestMinLengthConstraint/{name:minLength(5)}")]
    public string TestMinLengthConstraint(string name)
    {
        return "TestMinLengthConstraint";
    } 
    /// 
    /// 正则表达式约束,以三个数字开头,不满足就返回404
    /// 
    [HttpGet("TestRegexConstraint/{msg:regex(^\\d{{3}})}")]
    public string TestRegexConstraint(string msg)
    {
        return "TestRegexConstraint";
    }

    /// 
    /// 整型约束,范围约束8到18,不在这个范围内就返回404
    /// 
    [HttpGet("TestMultiConstraint/{id:int:range(8,18)}")]
    public string TestMultiConstraint(int id)
    {
        return "TestRangConstraint";
    }
}

}
以上只是挑了几个默认内置的约束进行举例演示,其实还有很多,剩下的小伙伴下来一定要试试,用法都很简单,如下:

单个约束时

参数:约束

案例:[HttpGet(“TestRequiredConstraint/{name:required}”)]

多个约束时

参数:约束1:约束2:…

案例:[HttpGet(“TestMultiConstraint/{id:int:range(8,18)}”)]

框架本身内置的约束,如下(小伙伴一定要敲敲):

约束 示例 说明
int {id:int} 匹配任何整数
bool {active:bool} 匹配 true 或 false。 不区分大小写
datetime {dob:datetime} 在固定区域性中匹配有效的 DateTime 值。
decimal {price:decimal} 在固定区域性中匹配有效的 decimal 值。
double {weight:double} 在固定区域性中匹配有效的 double 值。
float {weight:float} 在固定区域性中匹配有效的 float 值。
guid {id:guid} 匹配有效的 Guid 值
long {ticks:long} 匹配有效的 long 值
minlength(value) {username:minlength(4)} 字符串必须至少为 4 个字符
maxlength(value) {filename:maxlength(8)} 字符串不得超过 8 个字符
length(length) {filename:length(12)} 字符串必须正好为 12 个字符
length(min,max) {filename:length(8,16)} 字符串必须至少为 8 个字符,且不得超过 16 个字符
min(value) {age:min(18)} 整数值必须至少为 18
max(value) {age:max(120)} 整数值不得超过 120
range(min,max) {age:range(18,120)} 整数值必须至少为 18,且不得超过 120
alpha {name:alpha} 字符串必须由一个或多个字母字符组成,a-z,并区分大小写。
regex(expression) {ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)} 字符串必须与正则表达式匹配。 请参阅有关定义正则表达式的提示。
required {name:required} 用于强制在 URL 生成过程中存在非参数值
不用说,内置约束肯定不可能面面俱到,所以针对个性化约束,还需要自定义,继承 IRouteConstraint 接口便可实现自定义路由约束。 接口中包含 Match,当满足约束时,它返回 true,否则返回 false。如下
深圳网站建设www.sz886.com

你可能感兴趣的:(.NetCore之路由的最佳实现)