2012-07-03 48 views
5

我需要一些新的生活增添到遺留應用程序:)調用ASP.NET MVC控制器當請求.html文件

我想打電話的MVC控制器時,在請求一個「靜態」的HTML頁面爲了在將頁面返回給客戶端之前添加一些標記。

我試圖按照此線索找到了方法:How to read web.config settings in .html page?

...但即使我已經定義這條路線:

routes.MapRoute(
    name: "Topic", 
    url: "html/{fileName}.html", 
    defaults: new { controller = "Topic", action = "Index" }); 

控制器不會被調用。我有我的web.config中有定義:

<remove name="WebServiceHandlerFactory-Integrated" /> 
<add name="HTML" path="*.html" verb="*" 
    type="System.Web.UI.PageHandlerFactory" 
    resourceType="File" preCondition="integratedMode" /> 

我懷疑我需要調用除了PageHandlerFactory或者可能的問題是完全不同的東西別的東西。

更新:我的開發環境正在使用集成管道模式,但我需要檢查我的生產環境是否支持它。

+3

你在IIS7 +集成管道模式下運行嗎? –

回答

6

如果你這樣做:

routes.RouteExistingFiles = true; 

你應該找到這個工作 - 即使沒有處理程序的補充。在控制器中,您可以直接使用HostingEnvironment.VirtualPathProviderGetFile方法加載HTML,然後對其進行操作 - 或者更好的方法是使用正常的MVC視圖,將靜態文件顯示爲相同的內容,只需添加即可。

雖然請注意,這意味着任何可能被任何路由捕獲的文件都將被壓入MVC管道。然而,如果使用合理的路線和物理路徑分離,這通常不是一個問題。

+0

這個問題的真正答案是做安德拉斯和斯科特建議的。我測試了無論是否有路由更新(每個Andras)以及有沒有web.config設置(每個Scott),都需要它們使它適用於我正在嘗試執行的操作。多謝你們! –

+0

我添加了一些IgnoreRoutes規則來打開應用程序,直到其他靜態內容不需要服務器處理。 –

+0

是的,這是一個好主意:) –

3

我設置了與你一樣的情況,它對我來說效果很好,所以你有關鍵組件。有些事情要記住的測試和故障排除:

你的web.config確實需要爲HTML擴展生成提供:您的處理程序

<system.web> 
    <compilation> 
     <buildProviders> 
     <add extension=".html" 
      type="System.Web.Compilation.PageBuildProvider" /> 
     </buildProviders> 
    </compilation> 
</system.web> 

複製和粘貼作品對我來說,這樣看起來不錯。

雖然我在一個乾淨的項目中使用了默認的Home控制器,但MapRoute的複製和粘貼也適用於我。所以作爲一個雙重檢查,只需確認您有一個名爲Topic的控制器,並使用名爲Index()的ActionResult方法即可。

並且確保您的網址是localhost.com:{port}/html/test.html與/ html /在路徑中,因爲您的規則要求這樣做。

另一個好的測試是將MapRoute改爲使用aspx,然後測試一個aspx頁面,看看是否有效。這將確認它是否是IIS映射或者它是否是MVC規則。如果它與aspx一起工作,那麼問題與處理程序有關,但如果它與aspx一起失敗,那麼它就是MVC。

另請確認您使用的是IIS Express而不是Cassini。卡西尼不能正確處理,但IIS Express。您可以通過右鍵單擊您的項目來確認,並且您應該看到一個名爲「使用Visual Studio Development Studio ...」的菜單選項。這隻會在您正在使用IIS Express時才存在。

+0

我不認爲這有助於如果您希望請求擊中MVC控制器 - 頁面不會被直接執行,因爲它是在使用PageBuildProvider時的意圖,而是將請求傳遞給MVC控制器,然後最終以* .html'擴展名的URL代替一個視圖(可以是ASPX,可以是Razor或其他) –

+0

@Andras Zoltan,你是對的,它解釋了現有文件你需要從你的答案中添加routes.RouteExistingFiles = true。 –

+0

正如我上面提到的那樣,我的工作解決方案是整合來自Scott和Andras的回覆。我必須選擇一個,所以我標記了Andras'作爲答案,因爲他添加了指向未在此問題或原始鏈接的路徑配置中的指針。 –

相關問題