本系列文章基於Microsoft ASP.NET MVC Beta.
在一個route中,通過在大括號中放一個佔位符來定義( { and } )。當解析URL的時候,符號"/"和"."被作爲一個定義符來解析,而定義符之間的值則匹配到佔位符中。route定義中不在大括號中的信息則作爲常量值。
下面是一些示例URL:
下面是一些示例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對象:
下面的示例是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);
}
{
//忽略對.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);
}
更多文章請參考:
在這裏我不打算再詳細去講解。以下只是簡單的說明一下。
忽略對某類URL的Routing:
//忽略對.axd文件的Route,也就是和WebForm一樣直接去訪問.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
添加約束條件,支持正則表達式。例如我們需要對id參數添加一個必須爲數字的條件:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" },
new { id = @"[\d]*" } //id必須爲數字
);
"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 = "" }
);
}
{
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站點添加一個通配符:
然後點擊"通配符應用程序映射"下的"插入"按鈕,在彈出的對話框中如下設置:
你如果擔心添加通配符會給出現性能上的問題,那麼你可以修改Route爲帶擴展名的,這個擴展名是完全由你自己定義的,例如我們使用4mvc來做url的擴展名:
routes.MapRoute(
"Default", // Route 的名稱
"{controller}.4mvc/{action}/{id}", // 帶有參數的URL
new { controller = "Home", action = "Index", id = "" } // 設置默認的參數
);
"Default", // Route 的名稱
"{controller}.4mvc/{action}/{id}", // 帶有參數的URL
new { controller = "Home", action = "Index", id = "" } // 設置默認的參數
);
然後再在IIS6中添加這個擴展名的映射:
然後我們訪問的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 = "" } // 設置默認的參數
);
}
{
//忽略對.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
出處:http://QLeelulu.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利
出處:http://QLeelulu.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利