新建一個默認的ASP.NET MVC2應用程序,系統會默認的生成包含基本功能的應用程序,查看這些生成的代碼,可幫助我們理解ASP.NET MVC2。下面是對URL路由的理解,以備忘。
一、Global.asax.cs中的代碼:
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 = "About", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
Application_Start是網站啓動後最先執行的事件,所以對網絡路由的設置放在此處,具體通過方法routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = ""} );實現,方法的第一個參數是路由的名字,假如映射多個路由的時候,名字不能重複;第二個參數是Url的格式;第三個參數是個匿名對象,這個匿名對象所表達的是按照第二個參數格式所對應的默認的controller和action以及id是什麼,上述代碼中,默認Controller爲Home,默認的action爲About,默認的id爲“”。
注意到代碼:routes.IgnoreRoute("{resource}.axd/{*pathInfo}");其作用是防止對ASP.NET窗體的請求被路由到ASP.NET MVC中,如程序根目錄下有個hello.htm的文件,那麼輸入:http://localhost/hello.htm,此URL鏈接將不會被路由解析。
如何對ASP.NET窗體強制實施路由解析呢,可參考default.aspx.cs中的處理。
二、Default.asax.cs中的代碼:
public void Page_Load(object sender, System.EventArgs e)
{
// Change the current path so that the Routing handler can correctly interpret
// the request, then restore the original path so that the OutputCache module
// can correctly process the response (if caching is enabled).
string originalPath = Request.Path;
HttpContext.Current.RewritePath(Request.ApplicationPath, false);
IHttpHandler httpHandler = new MvcHttpHandler();
httpHandler.ProcessRequest(HttpContext.Current);
HttpContext.Current.RewritePath(originalPath, false);
}
其原理是改變當前路徑,使得變更後的路徑能被路由解析,然後改回原處理路徑。