URL 路由简介

摘要:
URL路由模型负责将传入的浏览器请求映射到特定的MVC控制器操作。URL路由在应用程序的Web配置文件(Web.Config文件)中启用。在应用程序中创建路由表的是Global.asax文件。清单1中的文件包含默认的Global。用于ASP。NET MVC应用程序。程序列表1Global.asax.susing System;

URL 路由简介

在本教程中,将介绍对于每个 ASP.NET MVC 应用程序都非常重要的 URL 路由功能。URL 路由模型负责将进入的浏览器请求映射到特定的 MVC 控制器操作。

在本教程的第一部分中,我们将学习标准路由表如何将请求映射到控制器操作。在本教程的第二部分中,我们将学习如何使用自定义路由修改默认的路由表。

使用默认路由表

在创建新的 ASP.NET MVC 应用程序时,应用程序已配置好使用 URL 路由。URL 路由在两个位置设置。

第一,URL 路由在应用程序的 Web 配置文件(Web.config 文件)中启用。在配置文件中有 4 个部分与路由有关:system.web.httpModules 部分,system.web.httpHandlers 部分,system.webserver.modules 部分和 system.webserver.handlers 部分。注意不要删除这些部分,因为没有这些部分路由就无法工作。

第二,但是更重要的位置,就是在应用程序中创建路由表的 Global.asax 文件。Global.asax 文件是一个特殊文件,它包含 ASP.NET 应用程序生命周期事件的事件处理程序。路由表是在 Application Start 事件中创建的。

程序清单 1 中的文件包含 ASP.NET MVC 应用程序的默认 Global.asax 文件。

程序清单 1 Global.asax.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Routing;
  7.  
  8. namespace MyApp
  9. {
  10.      public class GlobalApplication : System.Web.HttpApplication
  11.      {
  12.           public static void RegisterRoutes(RouteCollection routes)
  13.           {
  14.                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  15.                routes.MapRoute(
  16.                     "Default"// Route name
  17.                     "{controller}/{action}/{id}"// URL with parameters
  18.                     new { controller = "Home", action = "Index", id = ""
  19.                     // Parameter defaults );
  20.           }
  21.  
  22.           protected void Application_Start()
  23.           {
  24.                RegisterRoutes(RouteTable.Routes);
  25.           }
  26.      }
  27. }

当 ASP.NET 应用程序第一次启动时,调用 Application_Start() 方法。此方法将调用 RegisterRoutes() 方法。RegisterRoutes() 方法创建路由表。

默认路由表包含一个路由(名称为 Default)。Default 路由将 URL 的第一段映射到控制器名称,将第二段映射到控制器操作,将第三段映射到名称为 id 的参数。

假设将下面的 URL 输入到 Web 浏览器的地址栏:

/Home/Index/3

Default 路由将此 URL 映射为下列参数:

controller = Home

action = Index

id = 3

在请求 URL /Home/Index/3 时,执行下面的代码:

HomeController.Index(3)

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

让我们看几个例子,了解 Default 路由将 URL 映射到控制器操作的方式。假设将下面的 URL 输入到 Web 浏览器的地址栏:

/Home

由于 Default 路由参数的默认值,输入此 URL 将导致调用程序清单 2 中的 HomeController 类的 Index() 方法。

程序清单 2 HomeController.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. namespace MyApp.Controllers
  8. {
  9.      [HandleError]
  10.      public class HomeController : Controller
  11.      {
  12.           public ActionResult Index(string Id)
  13.           {
  14.                return View();
  15.           }
  16.      }
  17. }

在程序清单 2 中,HomeController 类包含名称为 Index() 的方法,此方法接受一个名称为 id 的参数。URL /Home 导致调用具有空字符串的 Index() 方法作为 id 参数的值。

由于 ASP.NET MVC Framework 激活控制器操作的方式,URL /Home 也可匹配程序清单 3 中的 HomeController 类的 Index() 方法。

程序清单 3 HomeController.cs(没有参数的 Index 操作)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. namespace MyApp.Controllers
  8. {
  9.      [HandleError]
  10.      public class HomeController : Controller
  11.      {
  12.           public ActionResult Index()
  13.           {
  14.                return View();
  15.           }
  16.      }
  17. }

程序清单 3 中的 Index() 方法不接受任何参数。URL /Home 将导致调用 Index() 方法。URL /Home/Index/3 也激活此方法(忽略 Id)。

URL /Home 还可匹配程序清单 4 中的 HomeController 类的 Index() 方法。

程序清单 4 HomeController.cs(带有可以为空的参数的 Index 操作)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. namespace MyApp.Controllers
  8. {
  9.      [HandleError]
  10.      public class HomeController : Controller
  11.      {
  12.           public ActionResult Index(int? id)
  13.           {
  14.                return View();
  15.           }
  16.      }
  17. }

在程序清单 4 中,Index() 方法有一个 Integer 参数。因为参数可以为空(值可以是 Nothing),所以可以在不引起错误的情况下调用 Index()

最后,使用 URL /Home 激活程序清单 5 中的 Index() 方法将导致异常,因为 Id 参数不是可以为空的参数。如果试图激活 Index() 方法,则将得到如图 1 所示的错误页。

程序清单 5 HomeController.cs(带有 Id 参数的 Index 操作)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. namespace MyApp.Controllers
  8. {
  9.      [HandleError]
  10.      public class HomeController : Controller
  11.      {
  12.           public ActionResult Index(int id)
  13.           {
  14.                return View();
  15.           }
  16.      }
  17. }

URL 路由简介第1张

图 1:激活需要参数值的控制器操作( 单击查看大图

另一方面,URL /Home/Index/3 可以与程序清单 5 中的 Index 控制器操作配合工作。请求 /Home/Index/3 导致调用带有值为 3 的 Id 参数的 Index() 方法。

创建自定义路由

对许多简单的 ASP.NET MVC 应用程序来说,使用默认的路由表就可以了。然而,您也可能会有特殊的路由需求。在这种情况下,应该创建自定义路由。

例如,假设正在创建博客应用程序。需要处理如下所示的进入请求:

/Archive/12-25-2009

当用户输入此请求时,想返回日期为 12/25/2009 的博客条目。为了处理这种类型的请求,需要创建自定义路由。

程序清单 6 中的 Global.asax 文件包含一个新的自定义路由,名称为 Blog,它处理形如 /Archive/条目日期的请求。

程序清单 6 Global.asax(使用自定义路由)

  1. using System.Web.Mvc;
  2. using System.Web.Routing;
  3.  
  4. namespace MyApp
  5. {
  6.      public class GlobalApplication : System.Web.HttpApplication
  7.      {
  8.           public static void RegisterRoutes(RouteCollection routes)
  9.           {
  10.                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  11.                routes.MapRoute(
  12.                     "blog",
  13.                     "Archive/{entryDate}",
  14.                     new {controller = "Archive", action = "Entry"}
  15.                     );
  16.                routes.MapRoute(
  17.                     "Default"// Route name
  18.                     "{controller}/{action}/{id}"// URL with parameters
  19.                     new { controller = "Home", action = "Index", id = ""
  20.                     // Parameter defaults );
  21.           }
  22.  
  23.           protected void Application_Start()
  24.           {
  25.                RegisterRoutes(RouteTable.Routes);
  26.           }
  27.      }
  28. }

向路由表添加路由的顺序非常重要。新的自定义 Blog 路由添加在现有的 Default 路由之前。如果顺序相反,则将总是调用 Default 路由,而不会调用自定义路由。

自定义 Blog 路由匹配任何以 /Archive/ 开头的请求。所以,它匹配所有下列 URL:

/Archive/12-25-2009

/Archive/10-6-2004

/Archive/apple

自定义路由将进入的请求映射到名称为 Archive 的控制器并激活 Entry() 操作。当调用 Entry() 方法时,条目日期将作为名称为 entryDate 的参数进行传递。

可以将 Blog 自定义路由用在程序清单 7 中的控制器上。

程序清单 7 ArchiveController.cs

  1. using System;
  2. using System.Web.Mvc;
  3.  
  4. namespace MyApp.Controllers
  5. {
  6.      public class ArchiveController : Controller
  7.      {
  8.           public string Entry(DateTime entryDate)
  9.           {
  10.                return "You requested the entry on " + entryDate.ToString();
  11.           }
  12.      }
  13. }

请注意,程序清单 7 中的 Entry() 方法接受 DateTime 类型的参数。ASP.NET MVC Framework 可以智能地将 URL 中的条目日期自动转换为 DateTime 值。如果无法将 URL 中的条目日期转换为 DateTime,则将给出错误消息。

总结

本教程的目的是向读者简单介绍 URL 路由。首先,我们研究了新的 ASP.NET MVC 应用程序中的默认路由表。了解了默认路由如何将 URL 映射到控制器操作。

接下来,我们了解了如何创建自定义路由。学习了如何向表示博客条目的 Global.asax 文件添加自定义路由。我们讨论了如何将对博客条目的请求映射到名称为 ArchiveController 的控制器和名称为 Entry() 的控制器操作。


http://msdn.microsoft.com/zh-cn/dd320290

免责声明:文章转载自《URL 路由简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cmake命令之add_subdirectory介绍windows端口占用处理方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS-为金额添加千分位逗号分割符

前言:这个功能在前端页面中使用的还是比较多的,正好我们的项目中也有使用此功能,不过YY同学写的代码不像个方法的样子,一个入口中间又插了几道子,所             以,我写了下面这个方法,经过测试,适用性还是蛮好的,留在这里以备后用! <!DOCTYPE html> <html> <head> <...

Java代码常用写法总结

1.字符串是否为空判断 以下是java 判断字符串是否为空的四种方法:方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:                      if(s == null || s.length() <...

vscode折叠代码后,没有显示结束大括号,只显示省略号怎么解决

最近vscode 更新了之后偶然发现,折叠地代码之后,结束的大括号没有显示出来,而是只显示省略号,感觉很不方便,如下图: 这样如果我要在下面接着写同级代码的话,感觉不踏实,因为不确定上一个代码块(通常是一个方法)到底结束没。。 其实解决方法很简单: 文件  ---->  首选项 -----------> 设置,打开设置菜单,如下图执行三步:...

使用boost线程定时器作为后台线程来切换主循环程序状态方法总结

  1:简单了解boost定时器 #include "stdafx.h" #include <string> #include <boost hread.hpp> #include <boost/asio.hpp> #include <iostream> using namespace boost::asi...

Spring AOP实现原理(递归拦截器)

一、AOP(Aspect Orient Programming,面向切面编程)相关术语: 1. 切面(Aspect):实现通用问题的类,例如日志,事务管理,定义了切入点和通知的类,通知和切入点共同组成了切面:时间、地点、做什么 2. 通知(Advice):类似Spring拦截器或者Servlet过滤器,是方法,定义切面要做什么,何时使用,有before,...

React+AntDesign使用Tree树控件完整展现其中的层级关系,并具有展开收起选择等交互功能

(一)需求展示效果图 1.新增时树形控件展示效果2.编辑时树形控件展示效果 (二)实现代码 1.使用树形控件,选择自己需要实现的功能的相关调用方法跟值 2.触发事件时获取数据及控件展示问题 (三)关于树形结构转化说明 如果后台传过来的树形数据跟展示不同,就需要前台这边自己进行处理 比如这次后台传过来的数据格式: 1.可以通过遍历,点扩展运算符获取数据每...