路由的功能除了处理请求匹配外,还具有链接生成的功能,特别是Mvc程序的View中使用IUrlHelper或TagHelper来生成页面的超链接:
其生成原理是通过链接参数(如上图所示的Controller和Action)去路由表中匹配,然后使用匹配结果中的第一个路由(可能会匹配到多个路由对象,具体内容在后续Area章节介绍)来生成链接。
更多路由信息及路由模板定义参考文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.1
控制器ASP.NET Core Mvc的Controller一般继承Controller类型实现,基类Controller中包含了Mvc中常用的返回方法(如Json以及View等)以及用于数据存储的ViewBag、ViewData、TempData。
AreaArea是Mvc应用中用来进行功能拆分或分组的一种方式,Area一般有自己的命名空间和目录结构,一般Area的默认目录结构如下:
ASP.NET Core Mvc和ASP.NET Mvc中的概念和用法基本上是一致的,但也存在一些区别:
1. Area下面的Controller需要使用Area特性标明当前Controller属于哪一个Area:
注:Area的目录结构不是必须的,只需要通过特性标记的Controller都会被正确识别,但目录结构的改变会导致无法找到View,关于View的查找路径会在后续介绍。
2. Area的路由注册也是在UseMvc方法中完成:
注:携带Area的路由模板需要放在前面,否则在生成通过IUrlHelper或TagHelper生成链接时,由于Controller以及action会匹配到没有area的模板并使用该模板生成链接,导致area参数被忽略,而生成类似:/controller/action?area=area的结果(在生成Url时,ASP.NET Core会将多余的路由参数放置到查询字符串中)
View View是基于Razor的HTML模板,Razor的详细语法参考文档:
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-2.1
ASP.NET Core Mvc的View与ASP.NET Mvc中的使用方法基本一致,主要区别如下:
1. 引入了TagHelper,使用TagHelper可以让View的代码更接近Html。更多TagHelper信息参考文档:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-2.1
2. Controller将参数传输到View的方法添加了ViewData特性,使用方法如下:
View中访问被ViewData标记的方式:
更多详情参考文档:
3. 新增View组件:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.1
配置View的查找路径:
ASP.NET Core可以在ConfigureServices方法中对RazorViewEngineOptions进行配置,如下图所示,在默认查找位置基础上添加了View以及AreaView的查找路径:
模型绑定
模型绑定指的是ASP.NET Core Mvc将请求携带的数据绑定到Action参数的过程,ASP.NET Core Mvc的模型绑定数据源默认使用Form Values、Route Values以及Query Strings,所有值都以Name-Value的形式存在,模型绑定时主要通过参数名称、参数名称.属性名称、参数名称[索引]等方式与数据源的Name进行匹配。
除了默认的数据源之外还可以从Http请求Header、Http请求Body甚至从依赖注入容器中获取数据,要从这些数据源中获取数据需要在相应参数上使用[FromHeader]、[FromBody]、[FromServices]特性。
如果需要获取的数据在不同数据源中都存在时(Name存在于多个数据源中),还可以通过特性指明从哪一个数据源中获取,如[FromForm]、[FromQuery]及[FromRoute]。
需要注意的是[FromBody]默认只支持Json格式的内容,如果需要支持其它格式,如XML需要添加相应的格式化器,添加方法如下图所示: