当前位置: 首页 > news >正文

【Web.路由】——URL生成

前几篇文章介绍了路由的相关知识,包括原理,模板和约束。围绕的一个点就是URL,那么URL是如何生成的呢?

在 ASP.NET CORE应用程序中,使用了一个叫 LinkGenerator的链接生成器来生成URL的。

LinkGenerator是一个中间件组件,可以在 DI 容器中得到它的实例,从而使用它来生成 URL。

在 ASP.NET CORE应用程序的所有类中以 DI的方式注入LinkGenerator来生成具体的URL。生成 URL是指根据当前上下文环境、控制器、操作、参数等生成一个可以点击的超链接字符串。

我们都知道,我们路由到资源的一般形式是——>控制器——>控制器下的方法——>方法中的参数

于是就有类似的URL字符串——>/控制器名/方法名/参数。

而这个URL模式生成的模板,是根据路由模板生成的,可以看这篇文章。

在MVC项目下注入LinkGenerator

比如在一个控制器中添加LinkGenerator,我们使用构造函数注入的方式

private LinkGenerator _link;
public 业务类名Controller(LinkGenerator link)
{
_link = link;
}

使用LinkGenerator生成URL

假设在控制器下有个Show方法,在注入了LinkGenerator之后,就可以使用它来生成URL。具体为

public IActionResult Show()
{string? url = _link.GetPathByAction("Add", "Product");return View();
}

这段代码中,GetPathByAction说明的是

(1). 第 1 个 是 action ,它是必选参数,用于指定操作的名称,这里使用的操作是Add方法。
(2). 第 2 个 是 controller,它也是必选参数,用于指定控制器的名称,这里使用的控制器是 Product。
(3). 该函数之后的参数都是可选参数,可有可无。
(4). 返回类型是string类型,也就是生成后的 URL 字符串。

注意这里的Show方法返回的是View,所以需要有个视图去接这个返回值,否则会报错。

当然也可以打断点在Return view这里,就可以看到生成的URL是什么样子的。

如何使用LinkGenerator生成带有参数的URL

使用 LinkGenerator生成的URL 中,需要使用object类型的 values 来实现,是一个匿名类型。

以id参数为例——>

        public IActionResult Show(){string? url = _link.GetPathByAction("Add", "Product", new { id = "100" });return View();}

从代码中得知,此参数类型是一个匿名参数,其中的id为参数值,值为100。

LinkGenerator生成URL时,两种类型值

使用它生成URL时,会有两种类型的值

(1). 显式值:明确指出控制器或操作的文本名称。 需要开发人员明确的知道生成URL的控制器、操作和参数的值的名称。
(2). 环境值:根据当前HTTP上下文 HttpContext 自动识别出控制器或操作的值。

如果我们把url改写为

 string? url = _link.GetPathByAction(HttpContext);

这个代码的意思就是根据 HttpContext上下文生成的URL就是当前访问的URL。

两种类型的混合使用

显式值会替代HttpContext指定的环境值,也就是显式值优先。

具体使用如下

 public IActionResult Show(){string? url = _link.GetPathByAction(HttpContext, "List", null, new { id = 100 });return View();}

这段代码的意思就是,如果某个可选参数没有,直接null替代,生成的URL就是路由模板规定的范式/控制器名/List/100

当然,更多的使用可以参考官网内容

http://www.lryc.cn/news/474754.html

相关文章:

  • 使用 Java 实现从搜索引擎批量下载图片
  • 基于Matlab GUI的说话人识别测试平台
  • Leetcode 热题100之二叉树2
  • <项目代码>YOLOv8 煤矸石识别<目标检测>
  • GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章
  • LVM与磁盘配额
  • xmuoj [蒙德里安的梦想] 状压dp个人笔记
  • ubuntu22安装搜狗输入法不能输入中文
  • HtmlAgilityPack 操作详解
  • 基于SSM医院门诊互联电子病历管理系统的设计
  • 【读书笔记/深入理解K8S】集群网络
  • 【专有网络VPC】连接公网
  • 论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction
  • 国科安芯抗辐照MCU和CANFD芯片发布
  • C++ 并发专题 - 无锁数据结构(概述)
  • NLP领域的经典算法和模型
  • 提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)
  • 论文概览 |《Journal of Transport Geography》2024.10 Vol.120
  • yum不能使用: cannot find a valid baseurl for repo: base/7/x86_64
  • 什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯
  • HTML 表单设计与验证
  • qt QDialog详解
  • supervisor服务“Exited too quickly“解决方案
  • 动态规划 —— 路径问题-地下城游戏
  • 沈阳乐晟睿浩科技有限公司抖音小店短视频时代的电商蓝海
  • ubuntu20.04安装ros与rosdep
  • 推理加速papers
  • 【02基础】- RabbitMQ基础
  • vue3中跨层传递provide、inject
  • Nacos-1.4.6升级2.3.2