[翻译:ASP.NET MVC 教程]ASP.NET MVC 路由概览

在本教程中,你将了解到每一个ASP.NET MVC应用程序都拥有的一个重要特性——ASP.NET Routing。ASP.NET路由模块负责将进来的浏览器请求映射至特定的MVC控制器行动中去。在学习完本教程后,你将理解标准路由表是怎样将请求映射至控制器行动中的。

使用默认路由表

当你创建一个新的ASP.NET MVC应用程序时,该程序已经被配置使用了ASP.NET路由。ASP.NET路由配置在在下列两种环境中。

第一,ASP.NET路由在你应用程序的Web配置文件(Web.config文件)中被启用。在配置文件中有四个部分与路由有关: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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
 
namespace MvcApplication1
{
    // 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);
        }
    }
}

当一个MVC应用程序首次启动时,Application_Start()方法就被调用。该方法被调用之后,就调用RegisterRoutes()方法。RegisterRoutes()方法创建了路由表。

默认路由表包含一个名为Default的单一路由。Default路由将URL的第一部分映射至控制器名,将第二部分映射至控制器动作以及将第三部分映射至名为id的参数。

想象一下你键入下列的URL到的浏览器地址栏中:

/Home/Index/3

Default路由将该URL映射至下列参数中:

controller = Home

action = Index

id = 3

当你请求URL /Home/Index/3时,下列代码就被执行:

HomeController.Index(3)

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

让我们看一看Default路由是怎样将URLs映射至控制器动作的一些例子吧。设想你将下列URL键入的浏览器地址栏中:

/Home

由于Default路由的参数采用默认值,键入该URL将会调用显示在清单2 HomeController中的Index()方法。

清单2——HomeController.cs

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

在清单2中,HomeController类包含了一个接受参数值Id的名为Index()的方法。URL /Home将会引起Index()方法被调用,该方法将接受值为空字符串的Id参数值。

由于MVC Framework请求控制器动作的方法,URL /Home也匹配在清单3 HomeController类中的Index()方法。

清单3——HomeController.cs (Index动作无参数)

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

清单3中的Index()方法不接受任何参数。URL /Home将会引起Index()方法被调用。URL /Home/Index/3同样会请求该方法(Id参数被忽略)。

URL /Home同样匹配在清单4 HomeController中的Index()方法。

清单4——HomeController.cs (Index地址接受为空参数)

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

在清单4中,Index()方法有一个Integer参数。因为该参数是一个可为空的参数(其值可为Null),所以Index()方法被调用时不会引发错误。

最后,通过URL /Home请求清单5中的Index()方法会引发一个异常,因为Id参数是一个不可为空的参数。如果你尝试请求该Index()方法,你将得到图1所示的错误。

清单5——HomeController.cs (有Id参数的Index动作)

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

[翻译:ASP.NET MVC 教程]ASP.NET MVC 路由概览

图1:请求一个期待得到参数值的控制器动作

URL /Home/Index/3,从另一方面讲,能正好使清单5中的控制器动作Index正常工作。这个请求/Home/Index/3使Index()方法被调用,向其传递一个值为3的Id参数。

小结

本教程的目标是向你提供一个ASP.NET路由的简要介绍。我们用一个新建的ASP.NET MVC应用程序测试了默认路由表。你了解到默认路由是怎样将URLs映射至控制器动作的。

作者:Kinglee
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

转载于:https://www.cnblogs.com/Kinglee/archive/2009/08/01/1536579.html