zoukankan      html  css  js  c++  java
  • 理解MVC提供的方法

      现在项目都前后端分离了,也慢慢的抛弃MVC方式了,转战API+前端的方式。用了这么多年MVC,简单梳理下MVC中常用的一些方法及作用,在应用层面上会有一些帮助,不涉及底层原理。文章仅从方法介绍相关的功能。

    一、RouteConfig.RegisterRoutes(RouteTable.Routes)

      一般默认情况下,在Global中会默认调用该方法,如下:

      protected void Application_Start()
       {
           AreaRegistration.RegisterAllAreas();
           //注册路由
           RouteConfig.RegisterRoutes(RouteTable.Routes);
       }

      RegisterRoutes方法主体如下:

      public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }

      该方法什么作用呢?

      其实这是MVC路由模块的一部分,简单的说下,路由模块有两大部分组成,一部分是在Web.config 文件启用了 ASP.NET 路由, 配置文件中有四个部分与路由相关:system.web.httpModules 节、system.web.httpHandlers 节、system.webserver.modules 节和 system.webserver.handlers 节, 请注意不要删除这些节,否则路由将不再起作用。

      另一部分就是我们现在说的RegisterRoutes方法,该方法的作用就是创建路由表, 负责将传入浏览器请求映射到特定 MVC 控制器操作。

      我们再简单介绍下路由模块是如何工作的?默认路由表包含一个路由(名为 Default), 默认路由将 URL 的第一段映射到控制器名称,将 URL 的第二段映射到控制器操作,并将第三段映射到名为id的参数。比如你在 web 浏览器的地址栏中输入以下 URL:/Home/Index/3,默认路由将此 URL 映射到以下参数:

      •   控制器 = Home

      •   操作 = 索引

      •   id = 3

      请求 URL/Home/Index/3 时,将执行以下代码:HomeController.Index(3)

      Default 路由包括所有三个参数的默认值。 如果不提供控制器,则控制器参数默认为值Home。 如果不提供操作,则操作参数将默认为值索引。 最后,如果不提供 id,id 参数将默认为空字符串。

     二、AreaRegistration.RegisterAllAreas()方法

      一般默认情况下,在Global中会默认调用该方法,如下:

      protected void Application_Start()
       {
           AreaRegistration.RegisterAllAreas();
           RouteConfig.RegisterRoutes(RouteTable.Routes);
       }

      AreaRegistration.RegisterAllAreas()作用就是注册 MVC 应用程序中的所有区域。具体的说就是此方法查找从 AreaRegistration 类派生的所有类型、 实例化类型的实例并在实例上调用了 RegisterArea 方法,通过在项目中注册每个区域(要细品)。

      区域干什么?每一个区域可以有Controller,View文件结构和路由配置,我们可以把区域看成嵌套的MVC,区域在项目中是常用到的,可以尝试使用理解。

      我们看上边的代码,发现. RouteConfig.RegisterRoutes(RouteTable.Routes)在AreaRegistration.RegisterAllAreas()的后面。请不要更改这个顺序,原因呢?AreaRegistration.RegisterAllAreas()的作用就是注册区域,匹配Area中的路由配置规则,而 RouteConfig.RegisterRoutes(RouteTable.Routes)要根据路由配置规则来创建路由表。这两个方法是相辅相成的。

      简单的说RegisterAllAreas对项目中的Area、Controller进行路由配置,然后RegisterRoutes根据前边的配置创建路由表。

    三、MapMvcAttributeRoutes方法  

      该方法是路由集合属性路由扩展类RouteCollectionAttributeRoutingExtensions中的方法,作用呢?直白点说就是用来完成特性路由注册。什么叫特性路由?

      前边介绍了我们通过RegisterRoutes创建了路由表,对于一个请求通过路由表就可以定位到相应的action。但是有些情况下URL会很复杂,如客户包含订单/costomer/{customerid}/orders,对于这种Uri,我们使用特性路由就会很方便,特性路由能够匹配传入的请求并把这些请求映射到控制器操作上。比如,在action上加一个特性即可

    [Route("customer/{customerId}/orders")]
    public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

       当然我们也可以利用特性路由实现以下操作:多个不同的URL要请求同一个action,比如我们想让首页通过/、/home、/home/index这几个URL都可以访问同一个action,则可以利用特性路由:

    [Route("")]
    [Route("home")]
    [Route("home/index")]
    public ActionResult Index()
    {
      return View();
    }

      通过以上实例我们可以看出,特性路由就是为了满足某种URL而对action加个入口,定义的特性路由也会加入路由表。

      启用特性路由首先在RegisterRoutes中开启特性路由功能:routes.MapMvcAttributeRoutes();  

      public static void RegisterRoutes(RouteCollection routes)
       {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
                routes.MapMvcAttributeRoutes();//启用特性路由
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }

    四、待补充

  • 相关阅读:
    VScode+phpStudy搭建php代码调试环境
    bluekeep漏洞(CVE-2019-0708)利用
    bugku论剑场web解题记录
    upload-labs通关集
    攻防世界web新手区
    Vulnhub-XXE靶机学习
    Volatility取证使用笔记
    攻防世界WEB新手练习
    攻防世界MISC新手练习
    攻防世界CRYPTO新手练习
  • 原文地址:https://www.cnblogs.com/qtiger/p/13072394.html
Copyright © 2011-2022 走看看