[翻译: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();
}
}
}
图1:请求一个期待得到参数值的控制器动作
URL /Home/Index/3,从另一方面讲,能正好使清单5中的控制器动作Index正常工作。这个请求/Home/Index/3使Index()方法被调用,向其传递一个值为3的Id参数。
小结
本教程的目标是向你提供一个ASP.NET路由的简要介绍。我们用一个新建的ASP.NET MVC应用程序测试了默认路由表。你了解到默认路由是怎样将URLs映射至控制器动作的。
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。