ASP.NET 路由配置
来源:互联网 发布:淘宝设置客服分流没用 编辑:程序博客网 时间:2024/06/06 06:59
ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler。MVC自定义了MvcHandler实现了Controller的激活和Action的执行。但是在请求到达这里之前把Http请求Url解析到正确的Controller和Action上,是通过自定义HttpModule来实现的,这个自定义的HttpModule就是Url路由系统UrlRoutingModule。1:UrlRoutingModule拦截请求的Url,对Url进行解析,得到以Controller和Action为核心的路由数据。2:UrlRoutingModule的好处: 2-1:灵活性,Url无需对应磁盘上的物理文件 2-2:可读性,可以设置自定义的Url规则。 2-3:SEO优化,对Url进行有效的优化,更容易被搜索收录。在以前IIS有一个Url重写模块,Url被IIS处理之前,根据其规则,重定向到物理文件。这个重写是IIS级别的。而MVC路由系统,它是ASP.NET的一部分,是通过托管代码实现的。3:Page类有一个公开的属性Page. RouteData,System.Web.Routing.RouteData表示通过路由系统对当前请求进行解析得到的路由数据。RouteData.Values属性表示存储路由变量的字典,可以从中取出路由变量的值。 //RouteTable.Routes.MapPageRoute("", "employees", "~/EmployeePage.aspx", true, null); var defaults = new RouteValueDictionary{ { "name", "*" }, { "id", "*" } }; RouteTable.Routes.MapPageRoute("", "employees/{name}/{id}", "~/EmployeePage.aspx", true, defaults); 上面注册路由变量name,id,在Page页面可以动过RouteData取出 string name = Page.RouteData.Values["name"].ToString() string id = Page.RouteData.Values["id"].ToString()4:Route和RouteTable -->一个Web具有一个全局的路由表,该表是通过System.Web.Routing.RouteTable的静态只读字段Routes表示 -->System.Web.Routing.RouteTable.Routes返回一个System.Routing.RouteCollection的集合。表示整个Web的全局路由表。 -->调用RouteCollection的MapPageRoute方法,将物理文件映射到一个URL模版上,这个过程是基于指定的URL模版创建一个路由对象并添加到全局路由表中。 -->System.Web.Routing.Route是抽象类RouteBase唯一的直接子类,基于模版创建的路由匹配规则就定义在Route中。 -->Route匹配请求的地址是否与Url模版匹配?首先将Url通过分隔符/进行拆分,拆分成多个段,每个段又分为变量和文本。变量有{}包围,文本是单纯的文本。检查文本的内容是否一致,以及变量的数量是否一致。 -->Route属性Constraints为定义在Url模版中的变量以正则表达式的形式座一些限定。属性Constraints类型为RouteValueDictionary,Key和Value分别表示变量名和限定的表达式。定义了Constraints,除了验证Url模版的段,还需通过正则表达式的验证。 -->Route属性Default为变量定义了默认值。Default类型为RouteValueDictionary -->Route属性DataTokens通过路由传递到处理程序,未使用的值。DataTokens的类型为RouteValueDictionary。 -->RouteTable.Routes.RouteExistingFiles,表示是否对已存在的物理文件使用路由。 -->通量匹配,可以采用通量匹配来匹配Url最后的部分,可以包含多个段。{*变量} RouteTable.Routes.MapPageRoute("", "employees/{name}/{*id}", "~/EmployeePage.aspx", true, defaults); /employees/李四/002/1212 那么变量id,能够匹配到002/1212 -->System.Web.Routing.RouteTable.Routes,通常有两个方法来注册路由 System.Web.Routing.RouteTable.Routes.MapPageRoute() 注册物理文件与Url模版之间的映射,也就是给System.Web.Routing.RouteCollection集合添加一个Route对象 System.Web.Routing.RouteTable.Routes.Ignore() 注册让路由系统忽略的Url模版。 5:使用System.Web.Routing.RouteTable.Routes.MapPageRoute()注册物理文件与Url模版之间的映射。 //对已存在的物理文件也使用路由 RouteTable.Routes.RouteExistingFiles=true; //Route对象的Default属性,指定路由变量的默认值。 var defaultW = new RouteValueDictionary { { "areacode", "010" }, { "days", 2 } }; //Route对象的Constraints属性,使用正则表达式约束路由变量。 var constraints = new RouteValueDictionary { { "areacode", @"0\d{2,3}" }, { "days", @"[1-3]{1}" } }; //Route对象的DataTokens属性,给处理程序传递值。 var dataTokens = new RouteValueDictionary { { "defaultCity", "Beijing" }, { "defaultDays", 2 } }; RouteTable.Routes.MapPageRoute("Weather", "Weather/{areacode}/{days}", "~/Weather.aspx", false, defaultW, constaints, dataTokens);6:使用System.Web.Routing.RouteTable.Routes.Ignore()忽略Url模版。Routes.Ignore()方法需要放在注册路由方法Routes.MapPageRoute()前面。否则不起作用。 启用了RouteTable.Routes.RouteExistingFiles=True,会对所有的请求都按照路由表进行解析。那么针对CSS文件,JavaScript文件也进行了解析。那么就要使用Routes.Ignore()忽略静态文件的脚本 //对已存在的物理文件也使用路由 RouteTable.Routes.RouteExistingFiles=true; RouteTable.Routes.Ignore("{filename}.css/{*pathInfo}");7:使用System.Web.Routing.RouteTable.Routes.add(new Route())将路由添加到全局路由表中。它的作用和System.Routing.RouteTable.Routes.MapPageRoute()是一样的 //创建Route对象 Route route = new Route("{areacode}/{days}", new RouteValueDictionary { { "areacode", "010" }, { "days", 2 } }, new RouteValueDictionary { { "areacode", @"0\d{2,3}" }, { "days", @"[1-3]{1}" }, { "httpMethod", new HttpMethodConstraint("GET") } }, new PageRouteHandler("~/Weather.aspx", true)); //将Route对象添加到全局路由表中 RouteTable.Routes.Add(route);8:根据注册的路由规则生成相应的Url,使用RouteTable.Routes.GetVirtualPath(RequestContext,RouteValueDirectionary).ViretualPath; RouteData r = new RouteData(); r.Values.Add("area","024"); r.Values.Add("days", 2); Response.Write(RouteTable.Routes.GetVirtualPath(null,null).VirtualPath); Response.Write("<br />..................."); RequestContext requestContext = new RequestContext(); requestContext.HttpContext = new HttpContextWrapper(HttpContext.Current); requestContext.RouteData = r; RouteValueDictionary values = new RouteValueDictionary { { "area", "011" }, { "days", 2 } }; Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, null).VirtualPath); Response.Write("<br />..................."); Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath); Response.Write("<br />...................");
阅读全文
0 0
- ASP.NET 路由配置
- ASP.NET MVC路由配置
- ASP.NET MVC路由配置
- Asp.Net MVC 路由配置
- ASP.NET WebApi 路由配置
- ASP.NET WebApi 路由配置
- ASP.NET WebApi 路由配置
- Asp.Net MVC2.0 Url路由配置
- ASP.NET MVC网站路由配置
- 浅析ASP.NET MVC路由配置
- 史上最全的ASP.NET MVC路由配置
- 史上最全的ASP.NET MVC路由配置
- ASP.NET MVC路由配置详解
- 史上最全的ASP.NET MVC路由配置
- Asp.Net MVC 路由
- Asp.Net MVC 路由
- ASP.NET 路由
- Asp.Net MVC 路由
- shell操作数据库脚本
- 【Python基础教程笔记(一)】环境,列表,元祖和字符串
- 分数化小数
- PCB快速掌握:[8]如何设置pcb层数
- 设置BottomNavigationBar导航栏的间距和文字,图片大小
- ASP.NET 路由配置
- session 对象、out对象和appliction对象
- NoSQL 数据库分类
- java字符串'1,2,3,'转换为'1','2','3'
- 边双连通分量——学习(复习)笔记
- 记录一下socket中常见的TCP设置
- hadoop学习记录—2.7.4documentation—hdfs
- 单元测试的重要性
- 这里有一份很欠填的问卷!