zoukankan      html  css  js  c++  java
  • ASP.NET MVC Route之WebForm路由与源码分析(一)

    WebForm中路由的渊源

    大多数做过.NET WEB FORM的人,第一次接触ASP.NET MVC, 对路由可能很陌生,在他们的潜意识里访问一个.Net Web 应用程序是这样的。

    从访问地址我们能看出,对应的是一个物理地址Index.aspx文件,是一对一的物理关系。假如我们在后期更改文件名称或移动文件位置后,页面地址也会发生改变,用URL地址再访问时页面会失效,且报404页面不存在的错误。

     其实路由并不是ASP.NET MVC特有的,其实在WEB.FORM开发里面就有了。只是我们没有去深究它。然而随着时间的推移,我们的URL不再是一个.aspx页面了,而是像{xxxx}/{xxx}的URL形式来对应一个aspx文件。

    因此,我们可以知道路由可以解决URL与物理文件分离,它维系着URL与物理文件之间的关联映射,使URL和物理文件的改变,都不会受影响。

     WEB FORM如何使用路由?

     1. 新建一个ASP.NET WEB应用程序,然后选择空项目模板。并新建一个Dafault.aspx、Global.asax文件。

    2. 打开Global文件,在Application_Start方法中添加路由信息。

    1) “List'”路由名称,可以理解为这个路由的名称是List,也就是路由的标识符。

    2) “Blog/{Name}/{Category}”表示以一个什么样的URL格式访问default.aspx页面,其中{Name}和{Category}表示路由变量。

    3)  “Default.aspx”:要访问的实际页面,也就是访问URL实际要映射的物理文件。

    4)  “ new RouteValueDictionary() { { "Name", "*" }, { "Category", "*" } }:表示路由变量默认值。当我们在URL中没有指定Name和Category,那么将采用默认值*.

    5)  “ new RouteValueDictionary() { { "ID", "*" } }:路由的Token值,可以理解为一个附加的路由值。

     3. 我们在路由集合中添加了一个名为“List”,访问格式为“Blog/{Name}/{Category}”的URL,实际访问页面为Default.aspx,默认路由变量Name="*",Category="*"的路由。当我们在浏览器中输入http://lcoalhost/Blog

    源码分析

    RouteTable.Routes.MapPageRoute背后到底发生了什么呢?下面我们来分析源码:

    注:使用ILSpy工具进行源码解析:下载地址

    RouteTable.cs

    using System;
    using System.Runtime.CompilerServices;
    namespace System.Web.Routing
    {
        [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
        public class RouteTable
        {
            private static RouteCollection _instance = new RouteCollection();  //单列模式
            public static RouteCollection Routes //属性,返回RouteCollection对象集合
            {
                get
                {
                    return RouteTable._instance;
                }
            }
        }
    }

      RouteCollection.cs类中的MapPageRoute方法

    public Route MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens)
            {
                if (routeUrl == null) //路由格式不能为空,否则会报routeRul异常。上面例子中指的是 "Blog/{Name}/{Category}"
                {
                    throw new ArgumentNullException("routeUrl");
                }
           // 实例一个路由对象,根据设置的路由信息,添加到路由集合RouteCollection中 Route route
    = new Route(routeUrl, defaults, constraints, dataTokens, new PageRouteHandler(physicalFile, checkPhysicalUrlAccess)); this.Add(routeName, route); return route; }

     总结

    RouteTable.Routes.MapPageRoute(),首先会转到调用静态成员RouteCollection的多个同名的重载MapPageRoute(),接着在MapPageRoute()里再调用Add()方法,这样就把一个名为Name的路由增加进了RouteCollection。
  • 相关阅读:
    初学Delphi,如何用delphi编写ini文件设置SQL数据库的连接!急!(100分)
    Delphi Treeview 用法(概念、属性、添加编辑插入节点、定位节点、拖拽等)
    [DELPHI]TreeView精确定位到每一个ITEM
    Oracle查看并修改最大连接数
    004-行为型-03-观察者模式(Observer)
    008-SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required
    java-mybaits-016-mybatis知识点StatementType
    004-行为型-02-模板方法模式(Template Method)
    004-行为型-01-策略模式(Strategy)
    java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】
  • 原文地址:https://www.cnblogs.com/liujie2272/p/13047703.html
Copyright © 2011-2022 走看看