ASP.NET MVC 入門3、Routing

本系列文章基於Microsoft ASP.NET MVC Beta.
在一個route中,通過在大括號中放一個佔位符來定義( { and } )。當解析URL的時候,符號"/""."被作爲一個定義符來解析,而定義符之間的值則匹配到佔位符中。route定義中不在大括號中的信息則作爲常量值。
下面是一些示例URL
Valid route definitions
Examples of matching URL
{controller}/{action}/{id}
/Products/show/beverages
{table}/Details.aspx
/Products/Details.aspx
blog/{action}/{entry}
/blog/show/123
{reporttype}/{year}/{month}/{day}
/sales/2008/1/5
 通常,我們在Global.asax文件中的Application_Start事件中添加routes,這確保routes在程序啓動的時候就可用,而且也允許在你進行單元測試的時候直接調用該方法。如果你想在單元測試的時候直接調用它,註冊該routes的方法必需是靜態的同時有一個RouteCollection參數。
下面的示例是Global.asax中的代碼,演示了添加一個包含兩個URL參數action  categoryName的Route對象:
複製代碼
public static void RegisterRoutes(RouteCollection routes)
{
    
//忽略對.axd文件的Route,也就是和WebForm一樣直接去訪問.axd文件
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
        
"Category",                                              // Route 的名稱
        "Category/{action}/{categoryName}",                           // 帶有參數的URL
        new { controller = "Category", action = "Index", categoryName = "4mvc" }  // 設置默認的參數
    ); 



protected void Application_Start()
{
    
//在程序啓動的時候註冊我們前面定義的Route規則
    RegisterRoutes(RouteTable.Routes);
}
複製代碼
更多文章請參考:
  • System.Web.Routing入門及進階 下篇 By 重典
  • System.Web.Routing入門及進階 上篇 By 重典
  • ASP.NET MVC URL Routing 學習 By Q.Lee.lulu
  • ASP.NET Routing (官方文檔)
    在這裏我不打算再詳細去講解。以下只是簡單的說明一下。
    忽略對某類URL的Routing:
     
        //忽略對.axd文件的Route,也就是和WebForm一樣直接去訪問.axd文件
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     
    添加約束條件,支持正則表達式。例如我們需要對id參數添加一個必須爲數字的條件:
    routes.MapRoute(
        
    "Default",                                              
        
    "{controller}/{action}/{id}",                           
        
    new { controller = "Home", action = "Index", id = "" },  
        
    new { id = @"[\d]*" } //id必須爲數字
    ); 
     
    使用星號(*)匹配不確定個數的參數,這會匹配URL後面所有的剩餘的參數。例如:
    query/{queryname}/{*queryvalues}
    對於url:query/aspnetmvc/preview5/routing ,則queryvalues參數匹配的參數爲 preview5/routing。
    url匹配Route是根據Route的定義順序來自上而下匹配的。例如我們定義兩個Route:
    複製代碼
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            
    "Default",                                              // Route 的名稱
            "{controller}/{action}/{id}",                           // 帶有參數的URL
            new { controller = "Home", action = "Index", id = "" }  // 設置默認的參數
        );
        routes.MapRoute(
            
    "Post",
            
    "Post/{id}",
            
    new { controller = "Post", action = "Index", id = "" }
        );
    複製代碼
    不知你看出上面定義的兩個Route有什麼問題沒有?我想你看出來了,URL永遠都匹配不了第二個Route,也就是名爲Post的Route,因爲能匹配第二個Route的url一樣也能匹配第一個Route,而url匹配Route是根據Route的定義順序來自上而下匹配的,所以URL永遠都匹配不了第二個Route。所以,在定義Route的時候,要將一些特別的Route放到前面。
    如果你要將ASP.NET MVC部署到IIS6下面,由於IIS6對於http://blog.51mvc.com/index這類沒有擴展名的URL是不會交由ASP.NET的aspnet_isapi.dll處理的,所以你的ASP.NET MVC程序部署到IIS6的時候可能會出現404錯誤。你可以爲你的ASP.NET MVC站點添加一個通配符:
    p_w_picpath
    然後點擊"通配符應用程序映射"下的"插入"按鈕,在彈出的對話框中如下設置:
    p_w_picpath
    你如果擔心添加通配符會給出現性能上的問題,那麼你可以修改Route爲帶擴展名的,這個擴展名是完全由你自己定義的,例如我們使用4mvc來做url的擴展名:
    routes.MapRoute(
        
    "Default",                                              // Route 的名稱
        "{controller}.4mvc/{action}/{id}",                           // 帶有參數的URL
        new { controller = "Home", action = "Index", id = "" }  // 設置默認的參數
    ); 
     
    然後再在IIS6中添加這個擴展名的映射:
    p_w_picpath
    然後我們訪問的URL類似於:http://blog.51mvc.com/Home.4mvc/index
    羣上有些朋友說希望教程能根據一個示例程序來寫,那樣更容易他們的學習。所以這裏就寫一個Blog的示例程序,爲了方便,Model就直接使用Blogengine的業務實體部分。在這裏我們先定義這個blog的Route:
    public static void RegisterRoutes(RouteCollection routes)
    {
        
    //忽略對.axd文件的Route,也就是和WebForm一樣直接去訪問.axd文件
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

        routes.MapRoute(
            
    "Admin",
            
    "Admin/{action}",
            
    new { controller = "Admin", action = "Index" }
        ); 

        routes.MapRoute(
            
    "PostById",
            
    "Post/{id}",
            
    new { controller = "Home", action = "Post", id = "" },
            
    new { id = @"[\d]+" }
        ); 

        routes.MapRoute(
            
    "PostBySlug",
            
    "Post/{slug}",
            
    new { controller = "Home", action = "Post" }
        ); 

        routes.MapRoute(
            
    "Default",                                              // Route 的名稱
            "{controller}/{action}/{id}",                           // 帶有參數的URL
            new { controller = "Home", action = "Index", id = "" }  // 設置默認的參數
        ); 

    }
     
     
    暫時就學到這裏吧。後面我會給出本示例Blog程序的代碼。Enjoy!Post by Q.Lee.lulu
    ---------------------------------------------------------------------
    更多內容,請關注http://blog.51mvc.com/ 和 http://bbs.51mvc.com/
  • 作者:QLeelulu Follow 
    出處:http://QLeelulu.cnblogs.com/ 
    本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章