ASP.NET MVC Routing概述

作者: JasenKin  來源: 博客園  發布時間: 2010-08-29 20:05  閱讀: 2565 次  推薦: 0   原文鏈接   [收藏]  
摘要:ASP.NET MVC正式版發布后就一直被關注,ASP.NET MVC Routing做為一個很重要的技術環節,大家一定要掌握。也許你看了很多高手寫的文章都無從入手,則這篇文章可以幫助到你。

  ASP.NET Routing模塊的責任是將傳入的瀏覽器請求映射為特有的MVC controller actions。
  使用默認的Route Table
  當你創建一個新的ASP.NET MVC應用程序,這個應用程序已經被配置用來使用ASP.NET Routing。 ASP.NET Routing 在2個地方設置。第一個,ASP.NET Routing 在你的應用程序中的Web配置文件(Web.config文件)是有效的。在配置文件中有4個與routing相關的代碼片段:system.web.httpModules代碼段,system.web.httpHandlers 代碼段,system.webserver.modules代碼段以及 system.webserver.handlers代碼段。千萬注意不要刪除這些代碼段,如果沒有這些代碼段,routing將不再運行。第二個,更重要的,route  table在應用程序的Global.asax文件中創建。這個Global.asax文件是一個特殊的文件,它包含ASP.NET 應用程序生命周期events的event handlers。這個route  table在應用程序的起始event中創將。

  在Listing 1中包含ASP.NET MVC應用程序的默認Global.asax:

 
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名稱
"{controller}/{action}/{id}", // 帶有參數的 URL
new { controller = "Home", action = "Index",
id
= UrlParameter.Optional } // 參數默認值
);

}

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}

  當一個MVC應用程序第一個啟動,Application_Start() 方法被調用,這個方法反過來調用RegisterRoutes() 方法。

  這個默認的route  table包含一個單一的route。這個默認的route將url的第一個段映射為一個controller名稱,url的第二個段映射為一個controller  action,第三個段映射為命名為id的參數。
  假如,你在網頁瀏覽器的地址欄中鍵入下面的url:/Home/Index/3,這個默認的route將這個url映射為下面的參數:
  controller = Home     controller名稱

  action = Index          controller  action

  id = 3                       id的參數

  當你請求/Home/Index/3這樣的url,下面的代碼將執行。HomeController.Index(3)

  這個默認的route包含3個默認的參數。如果你沒有提供一個 controller,那么 controller默認為Home。同樣,action默認為Index,id參數默認為空字符串。
  讓我們來看一些關于默認的route怎么映射urls為controller  actions的例子。假如你在你的瀏覽器地址欄中輸入如下的url:/Home, 由于這些默認的route參數有一些相關的默認值,鍵入這樣的URL,將導致HomeController類的Index()方法(如Listing 2)被調用。

 
1 namespace MvcRoutingApp.Controllers
2 {
3 [HandleError]
4 public class HomeController : Controller
5 {
6 public ActionResult Index(string id)
7 {
8 ViewData["Message"] = " 歡迎使用 ASP.NET MVC!";
9
10 return View();
11 }
12
13 public ActionResult About()
14 {
15 return View();
16 }
17 }
18 }
19
20

  在Listing 2中,這個HomeController 類包含一個名為Index()的方法。這個URL /Home導致Index()方法被調用,一個空的字符串將作為id參數的值。由于mvc框架調用controller actions的這種方式,這個URL /Home同樣匹配HomeController類中的Index()方法(如Listing 3)。

 
[HandleError]
public class HomeController : Controller
{

public ActionResult Index()
{

return View();
}
}

  在Listing 3中,這個Index()方法不接收任何參數。這個URL /Home將導致Index()方法被調用。URL /Home/Index/3同樣調用這個方法(ID被忽略)。

 
[HandleError]
public class HomeController : Controller
{

public ActionResult Index(int? id)
{

return View();
}
}

  Listing 4 - HomeController.cs (Index action with nullable parameter)

 
[HandleError]
public class HomeController : Controller
{

public ActionResult Index(int? id)
{

return View();
}
}

  在Listing 4中, Index() 方法有一個整數參數. 由于這個參數是可空參數 ,  Index() 將被調用而不引起錯誤.

  最后, 使用 URL /Home 來調用如Listing 5中的Index() 方法 將導致異常,因為這個ID參數不是一個可空的參數。如果你試圖去調用這個Index()方法,你將獲得如下圖所示的錯誤。

  Listing 5 - HomeController.cs (Index action with Id parameter)

 
[HandleError]
public class HomeController : Controller
{

public ActionResult Index(int id)
{

return View();
}
}

  另一方面,使用如Listing 5中的Index controller action,URL /Home/Index/3運行正常。Index controller action in Listing 5. /Home/Index/3請求將導致Index()方法被調用,ID參數擁有一個3的值。

  總結::這是一個關于ASP.NET Routing的簡要介紹. 應該了解了這個默認的route如何將URLs映射為controller actions。

  創建自定義的Routes (C#)

  這個教程,你將學會怎樣添加一個自定義的route到一個asp.net mvc應用程序。你將學會在Global.asax文件中,怎樣使用一個自定義的route來修改這個默認的route table。對于許多簡單的ASP.NET MVC 應用程序,這個默認的route  table將運行得很好。然而,你可能發現,你可能特定的routing 需求。那樣的話,你可能需要創建一個自定義的route。
  設想一下,例如,你正在建立一個博客應用程序,你可能想要去處理像/Archive/12-25-2009的輸入請求。當一個用戶鍵入這個請求,你想要返回與日期為12/25/2009相符的博客實體。為了處理這種類型的請求,你需要去創建一個自定義的route。
      在 Listing 1中,這個Global.asax文件中包含一個新的名為Blog的自定義route,它處理類似于/Archive/entry date的請求。

 
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 MvcRoutingApp
9 {
10 // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
11 // 請訪問 http://go.microsoft.com /?LinkId=9394801
12
13 public class MvcApplication : System.Web.HttpApplication
14 {
15 public static void RegisterRoutes(RouteCollection routes)
16 {
17 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
18 routes.MapRoute(
19 "Blog", // 路由名稱
20 "Archive/{entryDate}/{id}", // 帶有參數的 URL
21 new { controller = "Archive", action = "Entry", id = UrlParameter.Optional } // 參數默認值
22 );
23 routes.MapRoute(
24 "Default", // 路由名稱
25 "{controller}/{action}/{id}", // 帶有參數的 URL
26 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值
27 );
28
29 }
30
31 protected void Application_Start()
32 {
33 AreaRegistration.RegisterAllAreas();
34
35 RegisterRoutes(RouteTable.Routes);
36 }
37 }
38 }

  你添加到route  table的routes的順序是很重要的。我們新自定義的blog  route在現存的默認route之前添加。如果你顛倒了順序,那么這個默認的route總是先調用而不是這個自定義的route。
  這個自定義的blog  toute匹配任何以 /Archive/ 開頭的請求。所以,它匹配所有下列URLs:
  /Archive/12-25-2009

  /Archive/10-6-2004

  /Archive/apple

  這個自定義的route將輸入的請求映射至名為Archive的controller,并且調用 Entry() action。當 Entry() action被調用的時候,這個輸入的日期被當作名為entryDate的參數。
  Listing 2 - ArchiveController.cs

 
public class ArchiveController : Controller
{


public string Entry(DateTime entryDate)
{

return "You requested the date:" + entryDate.ToString();
}

}

  注意,在Listing 2中這個Entry()方法接收一個類型為DateTime的參數。MVC框架是足夠智能的,它自動將URL中輸入的date轉換為一個DateTime值。如果URL中輸入的date不能轉換為DateTime,錯誤將被引發。

  總結:這個教程演示怎樣來創建一個自定義的route。你學會了怎樣在Global.asax 文件中添加一個自定義的route到route  table。我們討論了怎樣為blog實體將請求映射為名為ArchiveController的controller,名為Entry()的controller action。

0
0
 
標簽:MVC Routing
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()