2011-05-01 66 views
3

我有一個HttpModule,它攔截所有請求並根據路由規則從數據庫加載數據。但是,我一直遇到一個問題;如果路徑不存在GetRouteData只適用:ASP.NET路由 - 如果路徑存在,GetRouteData不起作用

var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)); 

假設一個請求進來的URL http://localhost/contact,我得到有關該網址正確的路由數據如果路徑不會在文件系統中存在。當我想通過在路徑~/contact/default.aspx中創建一個aspx頁面來自定義網址時,出現問題。一旦我這樣做,GetRouteData返回null

我甚至嘗試創建一個新的HttpContext對象,但如果頁面存在,我仍然無法檢索路徑數據。

有沒有人遇到過這個問題?有解決方案/解決方法嗎?

所有幫助將不勝感激。

回答

3

RouteCollection.RouteExistingFiles設置爲true。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    // Cause paths to be routed even if they exists physically 
    routes.RouteExistingFiles = true; 

    // Map routes 
    routes.MapPageRoute("...", "...", "..."); 
} 

雖然小心。 IIS7的行爲與在Visual Studio中調試時使用的服務器略有不同。當我將我的應用程序部署到網絡上時,我受到了一些影響。看看這個feedback I submitted to Microsoft Connection

+0

嗯,確實很有幫助!這當然解決了我的問題,但不幸的是產生了一個新問題。當我這樣做時,我所有的CSS,js和圖像文件都會通過我的路由規則進行路由,而這並不是我想要的。我仍然希望現有文件使用原始處理程序,但我只想獲取路由值。那可能嗎? – 2011-05-02 00:13:13

+0

該問題不是通過路由現有文件創建的。這是由URL路由導致的單獨問題。我很抱歉,我不確定你的意思是你只是想獲得路由值。 – 2011-05-02 00:17:01

+0

舉例來說,我有一個「聯繫我們」頁面,我希望它顯示來自數據庫的內容以及提交聯繫信息的表單。如果「聯繫我們」頁面不存在,我可以調用:var pageName = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current))。Values [「name」];並檢索與該頁面相關的數據數據庫。但是,當頁面存在時,我不能這樣做,因爲'GetRouteData'返回null。說得通? – 2011-05-02 00:27:00