昨天有位同學問到關於在routes集合中添加自定義的路由實例的問題,她出現的問題是這樣的:
1.因為要在應用程序戾動時將實例添加到routes表中,所以需要把代碼寫在Global類的RegisterRoutes方法中,代碼如下兩種方式:
routes.Add("s", new Route("a/b", new WebFormRouteHandler("~/WebForm1.aspx")));
routes.Add("a", new Route("c/b", new RouteValueDictionary { { "controller", "Default" }, { "Home", "Index" } }, new WebFormRouteHandler("~/WebForm1.aspx")));
其中,a為路由的名稱,Route為路由的實例,同時,用到了一個WebFormRouteHandler的自定義類,該類的作用為處理一個虛擬路徑並指定到一個實際的地址,具體代碼如下:
public class WebFormRouteHandler : MvcRouteHandler { private string VirtualPath; public WebFormRouteHandler(string path) { VirtualPath = path; } protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler; return page; } }
她的問題是,用上邊第一種方式,那麼在做RedirectToAction()操作時,就會直接跳轉到WebForm1.aspx頁面,而使用第二種方式時,則正常,只有在訪問c/b時,才會訪問到該頁面。
對比上面兩段代碼,實際上第二種方式只是多了一個關於RouteValueDictionary類的實例,微軟官方對這個實例的定義為:
表示不區分大小寫的鍵/值對的集合,您可以在路由框架中的不同位置(例如,在定義路由的默認值時或在生成基於路由的 URL 時)使用該集合。
其實這個對象的創建,可以為url也就是c/b定義了一種默認的訪問規則,那麼url就一定會按照這種規則去訪問指定的頁面。
本文出自 “張劍的技術專欄” 博客,請務必保留此出處http://jianle.blog.51cto.com/429692/727680