认识 ASP.NET 3.5 MVC 路由 理解默认路由表

来源:互联网 发布:js let const 编辑:程序博客网 时间:2024/04/27 21:37

理解默认路由表

当你创建一个新的ASP.NET MVC应用程序时,应用程序已经被配置为使用ASP.NET路由。ASP.NET路由在两个地方设置。

第一点,在你的应用程序Web配置文件(Web.config文件)中启用ASP.NET路由。在配置文件中有四个节点与路由有关:sytem.web.httpModules节,system.web.httpHandlers节,system.webserver.modules节,以及system.webserver.handlers节。特别要小心不要删除了这些节点,因为没有它们路由将不能工作。

第二点,也是更为重要的一点,在应用程序的Global.asax文件中创建了一个路由表。Global.asax文件是一个特殊的文件,它包含了作用于ASP.NET应用程序生命周期事件的事件处理程序。路由表在Application Start事件期间创建。

ASP.NET MVC应用程序的默认Global.asax文件内容如下:

namespace MvcApplication{    // Note: For instructions on enabling IIS6 or IIS7 classic mode,     // visit http://go.microsoft.com/?LinkId=9394801    public class MvcApplication : System.Web.HttpApplication    {        public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                "Default",                                              // Route name                "{controller}/{action}/{id}",                           // URL with parameters                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults            );        }        protected void Application_Start()        {            RegisterRoutes(RouteTable.Routes);            RouteTable.Routes.RouteExistingFiles = false;            RouteMonitor.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);        }    }}

当一个MVC应用程序首次运行时,会调用Application_Start()方法。这个方法随后调用了RegisterRoutes()方法。RegisterRoutes()方法创建了路由表。

默认的路由表包含了一个路由(名叫Default)。Default路由将URL的第一部分映射到控制器名,URL的第二部分映射到控制器动作,第三个部分映射到一个叫做id的参数。

假设你在浏览器的地址栏输入了下面的URL:

/Home/Index/3

默认的路由将这个URL映射为下面的参数:

Controller = Home

Action = Index

id = 3

当你请求URL /Home/Index/3时,将会执行下面的代码:

HomeController.Index(3)

Default路由包含了所有三个参数的默认值。如果你不提供控制器,那么控制器参数默认值为Home。如果你不提供动作,动作参数默认为值Index。最后,如果你不提供id,id参数默认为空字符串。

 

Default路由是如何将URL映射到控制器动作的

设想你在浏览器地址栏输入了下面的URL:

/Home

由于Default路由参数的默认值,输入这个URL将会调用HomeController类的Index()方法。

using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index(string id)        {            return View();        }    }}

HomeController类包含了一个叫做Index()的方法,它接受一个叫做Id的参数。URL /Home将会导致调用Index()方法,并使用空字符串作为Id参数的值。

出于MVC框架调用控制器动作的方式,URL /Home也匹配以下中HomeController类的Index()方法。

using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index()        {            return View();        }    }}

以上代码的Index()方法不接受任何的参数。URL /Home将会导致调用这个Index()方法。URL /Home/Index/3也会调用这个方法(Id被忽略)。

URL /Home也会匹配以下代码HomeController类的Index()方法

using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index(int? id)        {            return View();        }    }}

 

Index()方法拥有一个整数参数。因为这个参数是一个可空参数(可以拥有Null值),因此可以调用Index()而不会引发错误。

最后,使用URL /Home 调用以下代码中的Index()方法将会引发一个异常,因为Id参数并非一个可空参数。如果你试图调用Index()方法,那么你将会获得一个错误。

using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index(int id)        {            return View();        }    }}
原创粉丝点击