1.URL生成

MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接。 IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分。在控制器、视图和视图组件中,可通过Url属性找到IUrlHelper的实例。在此示例中,将通过Controller.Url属性使用IUrlHelper接口来生成指向另一项操作的URL。

public class HomeController : Controller
{
public IActionResult Index()
{
var url1= Url.Action("Privacy");//Url:Home/Privacy
var url2 = Url.Action("Error");//Url:Home/Error
var url3 = Url.Action("Article");//Url:Blog/Article
var msg = $"url1: {url1}";
msg += $"\r\nurl2: {url2}";
msg += $"\r\nurl3: {url3}";
return Content(msg);
}
[HttpGet("custom/url/to/privacy")]//定义一个路由模版
public IActionResult Privacy()
{
return View();
}
public IActionResult Error(string code)
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

响应结果:

如果Url.Action方法都只设置Action名称,那么IUrlHelper接口会获取通过指向当前所在控制器里存在的Action操作,然后生成URL。如果当前控制器里Action操作自定义路由模版,则会生成对应路由模版URL。如果Action不存在当前控制器里,则会生成空字符串的URL。

2.URL生成方式

2.1根据操作名称生成URL

Url.Action (IUrlHelper. Action) 可以通过指定控制器(Controller)名称和操作(Action)名称来生成要链接的内容。而重载方法里还包含添加路由值对象,比如Url.Action("Home", "Index", new { id = 17 }),此处路由值对象就是new { id = 17 }(路由值对象通常是匿名类型的对象)。下面我们通过示例来看看:

public class HomeController : Controller
{
public IActionResult Index(int id)
{
var url = Url.Action("Index", "Home", new { id = , color = "red", sex = "m" });
return View();
}
}

通过DEBUG查看生成URL:

2.2根据路由生成URL

上面的代码演示了如何通过传入控制器和操作名称来生成URL。IUrlHelper还提供 Url.RouteUrl系列的方法。这些方法类似于Url.Action,但它们不会将action和controller的当前值复制到路由值。最常见的用法是指定一个路由名称,以使用特定路由来生成URL,通常不指定控制器或操作名称。

public class HomeController : Controller
{
public IActionResult Index(int id)
{
var url = Url.RouteUrl("Privacy_Name");
return View();
}
[HttpGet("custom/url/to/privacy",Name = "Privacy_Name")]//定义一个路由模版
public IActionResult Privacy()
{
return View();
}
}

通过DEBUG查看生成URL:

2.3在HTML中生成URL

IHtmlHelper提供HtmlHelper方法Html.BeginForm和Html.ActionLink,可分别生成<form>和 <a>元素。这些方法使用Url.Action方法来生成URL,并且采用相似的参数。HtmlHelper的配套Url.RouteUrl为Html.BeginRouteForm和Html.RouteLink,两者具有相似的功能。

@using (Html.BeginForm("Article", "Blog", FormMethod.Get, new { name = "nForm", id = "idForm" })){}
@Html.ActionLink("Article", "Article", "Blog")

通过浏览器工具查看生成HTML:

2.4在操作结果中生成URL

以上示例展示了如何在控制器中使用IUrlHelper。不过,控制器中最常见的用法是将URL生成为操作结果的一部分。ControllerBase和Controller基类为操作结果提供简便的方法来引用另一项操作。一种典型用法是在接受用户输入后进行重定向。

public IActionResult Edit(int id, Customer customer)
{
if (ModelState.IsValid)
{
// Update DB with new details.
return RedirectToAction("Index");
}
return View(customer);
}

3.区域(Area)

区域是ASP.NET功能,它提供了一种将ASP.NET Core Web应用程序划分为更小的功能组的方法,每个功能组都有自己的一组Razor Pages、控制器(Controllers)、视图(Views)和模型(Models)。区域实际上是应用程序内的结构。在ASP.NET Core Web项目中,Pages、模型、控制器和视图等逻辑组件保存在不同的文件夹中。ASP.NET Core运行时使用命名约定来创建这些组件之间的关系。对于大型应用程序,将应用程序区分为独立的高级功能区域可能更有利。例如,具有多个业务单位(如结账、计费、搜索等)的电子商务应用程序。每个单位都有自己的区域,以包含视图、控制器、Razor Pages和模型。下面的示例我们根据采购(Purchase)和销售(Sale)订单两个业务场景在MVC中配置使用默认传统路由和区域路由:

public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseMvc(routes =>
{
routes.MapAreaRoute(
name: "MyAreaPurchase",
areaName: "Purchase",
template: "Purchase/{controller}/{action}/{id?}");
routes.MapAreaRoute(
name: "MyAreaSale",
areaName: "Sale",
template: "Sale/{controller}/{action}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
//等价于
//routes.MapAreaRoute("purOrder_route", "Purchase",
//"Purchase/{controller}/{action}/{id?}");
//routes.MapAreaRoute("saleOrder_route", "Sale",
//"Sale/{controller}/{action}/{id?}");
//routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
}
}

在上面的示例中,路由值将与以下操作匹配:

[Area("Purchase")]
public class PurOrderController : Controller
{
public IActionResult Index()
{
return View();
}
}
[Area("Sale")]
public class SaleOrderController : Controller
{
public IActionResult Index()
{
return View();
}
}

在每个控制器加入AreaAttribute属性是表示该控制器是某个区域的一部分,比方说,PurOrderController控制器位于Purchase区域中,SaleOrderController控制器位于Sale区域中。 而没有 [Area] 属性的控制器不是任何区域的成员,在路由提供area路由值时不匹配时,打开对应控制器下的视图时将无法打开。在上面的示例中,只有所列出PurOrderController、SaleOrderController控制器下视图Index的路由值 { area = Purchase, controller = PurOrder, action = Index } 、{ area = Sale, controller = SaleOrder, action = Index }匹配才能打开对应链接。

4.实现IActionConstraint的路由约束

实现IActionConstraint约束最简单的方法是创建派生自System.Attribute的类,并将其置于操作(Action)和控制器(Controller)上。 MVC将自动发现任何应用为属性的IActionConstraint属性,便对应用程序模型应用程序进行约束。在下面的示例中,对路由数据中的国家/地区选择操作进行约束。

public class CountrySpecificAttribute : Attribute, IActionConstraint
{
private readonly string _countryCode;
public CountrySpecificAttribute(string countryCode)
{
_countryCode = countryCode;
}
public int Order
{
get
{
return ;
}
}
public bool Accept(ActionConstraintContext context)
{
string routeDataValue = context.RouteContext.RouteData.Values["id"] == null ? "" : context.RouteContext.RouteData.Values["id"].ToString();
return string.Equals(
routeDataValue,
_countryCode,
StringComparison.OrdinalIgnoreCase);
}
}
public class HomeController : Controller
{
[CountrySpecific("en-us")]
public IActionResult Index(string id)
{
return View();
}
}

根据官网解释IActionConstraint.Order是顺序约束意思,比如HomeController 控制器上有[CountrySpecific("en-us")]和[HttpGet](或者其他自定义属性约束)属性约束,数值较低的属性约束先运行。响应结果通过下面表格进行分析:

Route Url

Result

[SERVICE_NAME]/Home/Index/en-us

200

[SERVICE_NAME]/Home/Index/zh-cn

404

通过以上的表格可以知道,在此例中,当Index传入路由值(en-us)匹配时,Accept方法返回true以表示该操作是匹配项,然后可以打开连接,反之传入值(zh-cn)不匹配,则404。

参考文献:
在 ASP.NET Core 中路由到控制器操作

(9)ASP.NET Core 中的MVC路由二的更多相关文章

  1. (8)ASP.NET Core 中的MVC路由一

    1.前言 ASP.NET Core MVC使用路由中间件来匹配传入请求的URL并将它们映射到操作(Action方法).路由在启动代码(Startup.Configure方法)或属性(Controlle ...

  2. 在 Asp.Net Core 中安装 MVC

    在 ASP.NET Core 中安装 MVC 到目前为止,我们在本系列视频中使用的 ASP.NET Core 项目是使用“空”项目模板生成的.目前这个项目没有设置和安装 MVC. 两个步骤学会在 AS ...

  3. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  4. ASP.NET Core中使用自定义路由

    上一篇文章<ASP.NET Core中使用默认MVC路由>提到了如何使用默认的MVC路由配置,通过这个配置,我们就可以把请求路由到Controller和Action,通常情况下我们使用默认 ...

  5. gRPC在 ASP.NET Core 中应用学习(二)

    前言: 上一篇文章中简单的对gRPC进行了简单了解,并实现了gRPC在ASP.NET Core中服务实现.客户端调用:那么本篇继续对gRPC的4中服务方法定义.其他使用注意点进一步了解学习 一.gRP ...

  6. asp.net core 系列 5 MVC框架路由(上)

    一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明.  路由的知识点很多,参考了官方文档提取出一些重要的知识点来说.    在ASP.NET Core中是使用路由中间件来匹配传 ...

  7. ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

    除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...

  8. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  9. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

随机推荐

  1. SwitchGame---MybatisPLus

    //实体类package com.example.spring.entity; import cn.afterturn.easypoi.excel.annotation.Excel;import cn ...

  2. 解决nginx反向代理webservice的soap:address location问题

    原文:https://blog.csdn.net/mn960mn/article/details/50716768 一:首先来发布一个web service package com.ws.servic ...

  3. matplotlib 自带的几种美化样式

    1.用 matplotlib.pyplot.style.avaliable 可查看 matplotlib 自带的美化样式如下: ['bmh', 'classic', 'dark_background' ...

  4. contact form 7如何搭配Akismet过滤垃圾邮件

    contact form 7有很多站长在用,但是经常会有一些垃圾邮件进来,如何过滤呢?两个方法:1.表单提交启用验证码功能,很多垃圾邮件是用软件扫相应的端口,然后批量群发,如果用验证码了可以过滤很大一 ...

  5. Oracle 删除表恢复

    这句是查询Oracle中回收站的数据 select object_name,original_name,partition_name,type,ts_name,createtime,droptime ...

  6. Python GIL、CPU密集型、IO密集型

    Python GIL(Global Interpreter Lock(全局解释器锁)) 1:进程里面多个线程,线程 共享A=10 2:Python解释器,A改完值之后会传回进程容器,为了防止A和B同时 ...

  7. python语言(八)多线程、多进程、虚拟环境、unittest、生成测试报告

    一.多线程 进程与线程 进程:进程是资源(CPU.内存等)分配的最小单位,进程有独立的地址空间与系统资源,一个进程可以包含一个或多个线程 线程:线程是CPU调度的最小单位,是进程的一个执行流,线程依赖 ...

  8. manjaro 安装 tim 后无法输入中文

    cd /opt/deepinwine/tools sudo chmod 777 run.sh vim run.sh 在一开始的注释下输入 export GTK_IM_MODULE="fcit ...

  9. Windbg Call Stack(调用堆栈)窗口的使用

    调用堆栈是指向程序计数器当前位置的函数调用链.调用堆栈的顶部函数是当前函数,下一个函数是调用当前函数的函数,依此类推.显示的调用堆栈基于当前程序计数器,除非更改寄存器上下文. 在 WinDbg 中,可 ...

  10. csv与openpyxl函数

    csv 与openpyxl函数 csv函数 常用的存储数据的方式有两种--存储成csv格式文件.存储成Excel文件(不是复制黏贴的那种) 前面,我有讲到json是特殊的字符串.其实,csv也是一种字 ...