<一>Asp.netcore MVC 路由及URL生成
一、MVC介绍
MVC是使用模型-视图-控制器(Model-View-Controller)设计模式构建网页应用与API的丰富框架。用户请求被路由到控制器,控制器负责与模型( Model)协作,以执行用户操作和/或返回请求结果显示给用户,这种模式有助于实现关注分离。
模型-视图-控制器(MVC)架构模式将一个应用分为三部分。
- 模型(Model):MVC应用中的模型代表了应用的状态和业务逻辑或其可以展现的一些操作。业务逻辑应该封装在模型中,连同应用持久化状态实现逻辑。强类型视图一般使用特别设计的视图模型( ViewModel)类型,它包含了视图显示所需要的数据;控制器将创建并根据模型填充这些视图模型。
- 视图(View):负责在用户界面呈现内容。它们使用Razor视图引擎在HTML标记中嵌入.NET代码。视图中应仅包含少量的逻辑,并且这些逻辑应该与呈现内容相关。
-
控制器(Controller):控制器是承载用户交互、模型运转,并最终选择视图进行渲染的组件。在MVC应用中,视图只显示信息,控制器则处理视图并对用户输入和交互做出响应。在MVC模式中,控制器是最初的入口,负责选择同哪一个模型类型协作,以及选择哪一个视图来呈现。它不应该有太多职责。为避免控制器逻辑过于复杂,请使用单一职责原则将业务逻辑从控制器移到领域模型。
二、ASP.NET Core MVC 路由
ASP.NET Core MVC框架是一个配合使用ASP.NET Core优化的轻量级、开源、高度可测试的表现框架。它提供了一种基于MVC模式的方法来构建动态网站。
1、 路由: 一项强大的 URL 映射组件,使得我们可以定义应用程序的 URL 命名形式, 使得它在搜索引擎优化 (SEO) 和链接生成中运行良好, 而不用关心 Web 服务器上的文件到底是如何组织的。当接 收到一个请求时, 路由引擎解析 URL 并将其匹配至一个定义 URL 格式, 然后调用相关的控制器的操作方法。
routes. MapRoute ("default", " { controller=Home} / { action=Index) / {id?}") ; 路由模板: {controller = Home) 将Home 定义为默认控制器。 {action = Index}将 Index定义为默认操作 {id?}将id定义为可选。 默认路径参数和可选路径参数不需要出现在匹配的URL路径中。
- 多路由:可以在 UseMvc 里面通过添加 MapRoute 来添加多个路由。这样做可以定义多个约定,或添加专用于特定操作的常规路由。路由集合中的路由是有序的,并且会按照它们被添加的顺序进行处理。
app.UseMvc(routes =>{ routes. MapRoute ("blog", "blog/ {*article}", 这里的 blog 路由是专用常规路由,这意味着它不采用常规路由系统,而是专用千一个特定的动作。这个路由始终指向 BlogController.Article。 defaults: new { controller = "Blog", action = "Article" }) ; routes. MapRoute ("default", " { controller=Home} / { action=Index} / {id?}") ; }
- 特性路由:特性路由使用一组特性直接将操作映射到路由模板。HomeController.Index操作将对/、/Home或者/Home/Index中任一URL路径访问执行。
[Route("")] [Route ("Home") [Route ("Home/Index") public IActionResult Index() { return View(); }
特性路由也可以使用 HTTP[Verb]特性.对于/products 这个 URL 路径来说,ProductsApi.ListProducts 操作会在 HTTP 动词是 GET 时执行
[HttpGet("/products")] public IActionResult ListProducts() { }
- 组合路由:为了减少特性路由的重复部分,控制器上的路由特性会和各个操作上的路由特性进行结合。
[Route("products") ] public class ProductsApiController : Controller { [HttpGet] public IActionResult GetProducts () { ... } }
- 路由模板中的标记替换([controller]、 [action]、 [area])
[ Route (" [controller]/ [action]") public class ProductsController : Controller
[HttpGet("[controller]/ [action]")] //匹配 '/Products/List'
public IActionResult List () {
[HttpPost("Buy")] //匹配'Products/Buy' 和'Store/Buy' [HttpPost ("Checkout")] //匹配'Products/Checkout' 和'S七ore/Checkout' public 工ActionResul七 Buy()
- IRouteTemplateProvider 自定义路由特性,当特性被启用时,自动使用template设置的特性
public class MyApiControllerAttribute : Attribute, IRouteTernplateProvider {
public string Template => "api/[controller]";
public int? Order { get; set; } public string Name { get; set; } }
三、生成Url
MVC应用程序可以使用路由URL的生成特性来生成URL链接到操作。 生成URL可消除硬编码URL, 会使你的代码更健壮和易维护。IUr!Helper接口是MVC与生成URL路由之间基
础设施的基本块。可以通过控制器、视图以及视图组件中的Uri属性找到 个可用的IUrlhelper。
- 通过操作名生成URL Uri.Action (IUrlHelper、 Action) 以及所有相关的重载都是基于通过指定控制器名和操作名来指定要链接的内容。
public IActionResult Index() { var url = Url.Action ("Destination"); return Content($"Go check out {url}"); }
- 通过路由生成URL
public IActionResult Index() { var url = Url.RouteUrl("Destination"); return Content($"Go check out {url}"); }
- 在操作结果中生成URL:ControllerBase和Controller基类为引用其他操作的操作结果提供了简便方法。用法是接受用户输入后进行重定向。
return RedirectToAction("Index");
四、区域(Areas)
是一种 MVC功能, 用来将相关功能组织为一个组,使用区域允许应用程序拥有多个相同名称的控制器,只要它们具有不同的区域。
app.UseMvc(routes => { routes.MapAreaRoute ("blog_route", "Blog", "Manage/{controller}/{action}/{id?}"); routes.MapRou七e("default_route", "{controller)/{action}/{id?}"); })
当匹配 URL 路径(如/Manage/Users/AddU ser) 时, 第一个路由会产生路由值{ area = Blog, controller = Users, action = AddUser }。 area 路由值是通过 area的默认值产生的;
也可以通过区域特性areaAttribute 限定控制器属于哪个区域。
[Area ("Blog")] public class UsersCon七roller : Con七roller { }