首页 > 其他分享 >Blazor 判断一个内部url是否符合路由

Blazor 判断一个内部url是否符合路由

时间:2024-06-21 16:10:50浏览次数:19  
标签:return url assemblies foreach var new Blazor public 路由

Blazor内部的方法不对外公开,要么反射,要么自己写
写的不好,参考自https://q.cnblogs.com/q/146281 ,有一点改动。
这个其实是适合后端的,比Blazor的路由约束支持要多,判定上可能会出现失误。
而且"Microsoft.AspNetCore.Routing" Version="2.2.2"包已过时了

public class RouteHelper
{
    private readonly List<string> routeTemplates = [];

    public RouteHelper(Assembly[] assemblies)
    {
        routeTemplates = GetRouteTemplates(assemblies);
    }

    public bool IsMatch(string url)
    {
        // https://q.cnblogs.com/q/146281
        var urlPath = new Uri(url).AbsolutePath;

        IServiceCollection services = new ServiceCollection();
        services.AddOptions<RouteOptions>();
        using ServiceProvider sp = services.BuildServiceProvider();
        var routeOptions = sp.GetRequiredService<IOptions<RouteOptions>>();
        var constraintResolver = new DefaultInlineConstraintResolver(routeOptions, sp);
        foreach (string routeTemplate in routeTemplates)
        {
            var parsedTemplate = TemplateParser.Parse(routeTemplate);

            var values = new RouteValueDictionary();
            var matcher = new TemplateMatcher(parsedTemplate, values);
            if (matcher.TryMatch(urlPath, values))
            {
                if (parsedTemplate.Parameters.Count == 0)
                {
                    return true;
                }

                foreach (var parameter in parsedTemplate.Parameters)
                {
                    if (!parameter.InlineConstraints.Any())
                    {
                        return true;
                    }

                    foreach (var inlineConstraint in parameter.InlineConstraints)
                    {
                        var routeConstraint = constraintResolver.ResolveConstraint(inlineConstraint.Constraint);
                        var routeDirection = RouteDirection.IncomingRequest;
                        bool matched = routeConstraint!.Match(httpContext: null, route: null, parameter.Name!, values, routeDirection);
                        if (matched)
                        {
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }

    public static List<string> GetRouteTemplates(Assembly[] assemblies)
    {
        var routes = new List<string>();

        foreach (var assembly in assemblies)
        {
            foreach (var type in assembly.GetTypes())
            {
                var routeAttribute = type.GetCustomAttribute<RouteAttribute>();
                if (routeAttribute != null)
                {
                    routes.Add(routeAttribute.Template);
                }
            }
        }

        return routes;
    }
}

标签:return,url,assemblies,foreach,var,new,Blazor,public,路由
From: https://www.cnblogs.com/Yu-Core/p/18260711

相关文章

  • 虚拟环境 反向解析,有名分组和无名分组的反向解析,路由分发,名称空间,虚拟环境,路径
    Ⅰ反向解析【一】基础的URL配置在实际的Django项目中,经常需要获取某个具体对象的URL,为生成的内容配置URL链接。比如,我要在页面上展示一列文章列表,每个条目都是个超级链接,点击就进入该文章的详细页面。现在我们的urlconf是这么配置的:path('post/<int:pk>/',views.some_view)......
  • dedecms图集dede:field name='imgurls'不能二次使用的解决办法
    {dede:fieldname='imgurls'alt='图片输出区'}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:field}这个标签不能同时使用2次,所以第二次的话用!!!{dede:productimagelist}图片链接 [field:linkurl/]图片地址[field:imgsrc/]{/dede:productimagelist}   ......
  • 智能选路——策略路由
    设计思路:实验一:AR1两个地址通过设置于FW1上的策略路由访问150.1.2.2外网地址,通过策略路由设置,分别实现通过155.1.122.0/24访问和通过136.1.123.0/24访问。实验二:在两条路由上设置相互备份一、网络拓扑二、基础环境配置1、按拓扑所示地址配置各接口地址(此处省略)2、在AR1......
  • URL编码
    URL编码是浏览器发送数据给服务器时使用的编码,它通常附加在URL的参数部分。‍为什么需要URL编码举个例子,我们在百度里搜索“中文”这两个字,其发送给后台服务器的网址类似这样的:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87我们可以打开浏览器控制台查看:​这些字符串......
  • 5分钟了解LangChain的路由链
    上上篇文章《5分钟理透LangChain的Chain》里用到了顺序链SequentialChain,它可以将多个链按顺序串起来。本文介绍LangChain里的另外1个重要的链:路由链。1.路由链概念**路由链(RouterChain)**是由LLM根据输入的Prompt去选择具体的某个链。路由链中一般会存在多个Prompt,Prompt结合LL......
  • 常见数据库url 和driver
    转自:http://blog.csdn.net/kimsoft/article/details/3305675PropertiesfilewithJDBC-relatedsettings.##########HSQLDB##########jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://localhost:9001/bookstorejdbc.username=sajdbc.password......
  • BaseHref 以及前端路由的问题
    BaseHref以及前端路由的问题BaseHref是什么?MDN,说的直白一点就是,这个站点里面所有的访问主站的资源文件,都会在路由前面加上这个basehref,包括*js,scss,image,ajax,......**。如果一个DOM里面有多个这样的base,只有第一个会起作用。BaseHref在Angular工程的编译中有......
  • m2_day12 [URL + Socket]
    课程内容:URL和SocketServer端Client端URL和SocketURL=>统一资源定位符:网址URLurl=newURL("网址");URLConnectionuc=url.openConnection();InputStreamis=uc.getInputStream();....​uc.getContentLength();得到目标内容长......
  • Spring Cloud Gateway网关下Knife4j文档聚合,以及动态路由的读取和代码配置
    SpringCloudGateway网关下Knife4j文档聚合,以及动态路由的读取和配置一.Knife4j文档聚合1.1基础环境明细1.2集成knife4j1.2.1maven1.2.2yml配置1.2.2.1其他模块配置1.2.2.2manual手动配置模式1.2.2.3discover服务发现模式1.2.2.3==这里请注意==:如果你使用了:S......
  • (四十三)Vue Router之嵌套路由
    文章目录什么是嵌套路由嵌套路由的使用demo上一篇:(四十二)Vue之路由及其基本使用VueRouter什么是嵌套路由实际生活中的应用界面,有可能由多层嵌套的组件组合而成。同样地,URL中各段动态路径也按某种结构对应嵌套的各层组件,例如:/user/foo/profile......