代码改变世界

asp.net mvc 初次任务-从路由开始认识MVC

2010-01-23 21:16  穆容  阅读(518)  评论(0编辑  收藏  举报

mvc结构和传统的ASP.NET程序一个最大的不同,就是引入了路由的概念。

我们传统的ASP.NET BS程序用地址来访问例如:http://localhost/dfky/index.aspx?id=12或者http://localhost:45456/index.aspx?id=22

这样就可以定位到我们要访问的页面了。而在MVC框架中,我们使用路由来导航页面。

开发新建项目后,根目录下面的Global.asax文件。

 

        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
            );

   }

这就是对路由的定义。

 

当程序运行后,Application_Start() 方法被调用,同时调用方法内的RegisterRoutes() 方法。这个方法创建了路由表。

默认的ASP.NET MVC路由表中只含有一个叫做default的路由。这个默认路由把url拆分成三个部分分别对应controller,action和View。

当请求URL:/Home/Index/3时,下列代码执行:HomeController.Index(3)。

如果不指定controller,则默认为Home,不指定Action则默认为Index,不指定参数则默认为空。

 

我们将通过例子来看一下到底默认路由是怎么把URl映射到controller和action的。想象我们在地址栏中输入了如下URL:

/Home

由于默认action为Index,所以下面的方法被调用

  1. using System.Web.Mvc;  
  2.  
  3. namespace MvcApplication1.Controllers  
  4. {  
  5.     [HandleError]  
  6.     public class HomeController : Controller  
  7.     {  
  8.         public ActionResult Index(string id)  
  9.         {  
  10.             return View();  
  11.         }  
  12.     }  
  13. }  

这个方法接受一个字符串类型的id参数,上面的URL执行了这个方法,传入一个空的id。

由于mvc框架引用controller actions的方式,/Home同时也会触发下列事件

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

这个方法不接受参数,/Home将触发这个Index(),同时/Home/Index/3也会调用这个方法,id参数将被忽略。

/Home也会与下面的方法匹配

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

该方法接受一个int类型的参数id,因为这个参数可以为null,该方法将被调用而不会产生任何错误。

最后调用下面的方法,这里会引发一个异常

  1. using System.Web.Mvc;  
  2.  
  3. namespace MvcApplication1.Controllers  
  4. {  
  5.     [HandleError]  
  6.     public class HomeController : Controller  
  7.     {  
  8.         public ActionResult Index(int id)  
  9.         {  
  10.             return View();  
  11.         }  
  12.     }  
  13. }  
//部分代码引用自51CTO