前几篇文章介绍了路由的相关知识,包括原理,模板和约束。围绕的一个点就是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
当然,更多的使用可以参考官网内容