2011-01-13 28 views
9

所以我有這樣的路線在我的MVC 3應用IIS 7下運行:MVC路由當一個文件實際上是在指定的位置存在

routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 

的訣竅是,一個文件實際上存在於/ virtualtour/config.xml中。看起來這個請求只是返回該位置的xml文件,而不是點擊處理XML的路由,進行一些更改並返回一個自定義的XmlResult。

有關如何告訴我的應用程序能夠在磁盤上存在文件的情況下命中路徑而不是實際文件的任何建議?

編輯:似乎我可以在Global.asax的RegisterRoutes方法中使用routes.RouteExistingFiles = true;來告訴應用程序忽略磁盤上的文件。然而,這會在全局範圍內設置標誌並在應用程序中打破許多其他請求。例如,我仍然希望調用/assets/css/site.css來返回CSS文件,而不必爲每個靜態資產專門設置路由。所以現在的問題是,有沒有辦法在每個路線的基礎上做到這一點?

+3

我不認爲有一個簡單的方法來實現這一點。爲什麼不簡單地將靜態文件移動到`〜/ App_Data`文件夾? – 2011-01-13 15:55:46

回答

6

到目前爲止,我發現的最好的答案是全球適用routes.RouteExistingFiles=true,然後有選擇地忽略我想要傳遞給現有文件如.js,.css等的路線。所以我最終得到了類似這個:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("*.js|css|swf"); 
      routes.RouteExistingFiles = true; 

      routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 
} 

如果有人有更好的解決方案,我想看看它。我更願意有選擇地將「RouteExistingFIles」標誌應用於單個路線,但我不知道是否有辦法做到這一點。

0

這裏沒有解決方案,只是一個想法。

您可以嘗試實施基於您自己的VirtualPathProvider的解決方案,該解決方案將提供您自己的Web路徑到文件系統路徑的映射,併爲您不想要的所有路徑使用默認提供程序。

0

一個非常簡單的解決方案,當然,如果你認爲斯科特的答案,將如:routes.IgnoreRoute("templates/*.html");routes.IgnoreRoute("scripts/*.js");routes.IgnoreRoute("styles/*.css");

這給你只需提供路徑到RoutesCollection的簡單性,並避免了必須啓動例如的工作。一個VirtualPathProvider。

0

你可以嘗試UrlRewiting如:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="VirtualTourConfig"> 
      <match url="^virtualtour/config.xml" /> 
      <action type="Rewrite" url="virtualtour/config" /> 
     </rule> 
     </rules> 
    </rewrite> 

NB我用這對不同的使用情況下(即服務從asp.net MVC的角度應用程序) - 我沒有測試過是否MVC路由在URL重寫後發生。

在我來說,我有一個正常的MVC路線(即/Dashboard/ =>DashboardController.Index()),但需要在Views/Dashboard/Index.cshtml所有相對路徑爲靜態文件,而不通過MVC路由即/Dashboard/app/app.module.js越來越糊塗必須服務於一個靜態文件。我使用UrlRewriting來將/Dashboard/(.+)映射到/ng/Dashboard/{R:1},如下所示:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="Dashboard"> 
      <match url="^dashboard/(.+)" /> 
      <action type="Rewrite" url="ng/dashboard/{R:1}" /> 
     </rule> 
     </rules> 
    </rewrite> 
相關問題