2012-05-04 113 views
0

我試着問這個問題有點不同之前,但它不明白,所以我會嘗試另一種方式:路線圖像查看文件夾中的Asp.Net MVC 3

我有一個MVC 3應用程序,其中像往常一樣,我在視圖目錄中有視圖。然而,由於各種原因,我需要每個視圖的圖像與視圖本身在同一個文件夾中,即在我的情況下,例如查看/手冊/ EN-US /名稱

下面是我用的路線:

routes.MapRoute(
       "Parameter", 
       "{controller}/{action}/{lang}/{prod}", 
       new { controller = "Manuals", action = "Product", lang = "en-US", prod = "name" } 
     ); 

現在,正如所提到的,我需要的圖像這一觀點是在同一個文件夾中,從而使圖像路徑可以簡單地爲「ATEXSymbol.svg」。

當我只是有這條路線,並使用這樣一個簡單的相對路徑的形象,我得到的是這樣的錯誤:

The view 'da-DK/ATEXSymbol.svg' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Manuals/da-DK/ATEXSymbol.svg.aspx ~/Views/Manuals/da-DK/ATEXSymbol.svg.ascx ~/Views/Shared/da-DK/ATEXSymbol.svg.aspx ~/Views/Shared/da-DK/ATEXSymbol.svg.ascx ~/Views/Manuals/da-DK/ATEXSymbol.svg.cshtml ~/Views/Manuals/da-DK/ATEXSymbol.svg.vbhtml ~/Views/Shared/da-DK/ATEXSymbol.svg.cshtml ~/Views/Shared/da-DK/ATEXSymbol.svg.vbhtml

因此,基本上,它是在正確的尋找圖像語言文件夾,但沒有產品名稱文件夾部分,並添加了多個視圖擴展名之一。我知道MVC並沒有真正期望在相同的文件夾中這個相對路徑,但我幾乎沒有任何選擇。爲了達到我的目的,我需要將圖像放在同一個文件夾中。

那麼我該如何做到這一點?

編輯:

其實,我錯了上面一點,說路的產品名稱的部分缺失,當然事實並非如此。這部分路徑是視圖本身的名稱。所以基本上,我通過src屬性中的簡單相對路徑(只是圖像文件的名稱)獲得的路徑會爲圖像創建正確的路徑。唯一的問題是,添加視圖文件擴展名...

任何人都知道如何解決這個問題?

編輯2:

順便說一句,我可以使用Url.Content,但由於某種原因,不能正常工作。如果我用這個:

<embed type="image/svg+xml" src="@Url.Content("~/Content/images/da-DK/3153/CheckRotation.svg")"></embed> 

...它的作品...但如果我用這個(同樣的事情,但在視圖文件夾中的圖片)...

<embed type="image/svg+xml" src="@Url.Content("~/Views/Manuals/da-DK/CheckRotation.svg")"></embed> 

...它不起作用。如果我在Web檢查器中檢查後面示例中的路徑,它看起來像正確的路徑(localhost:49864/Views/Manuals/da-DK/CheckRotation.svg),但帶有無法找到的消息。

編輯3:

引發的思考網站的答案給了我一個解決方案,我不得不修改了一下,因爲我需要的路線建議意見本身。所以我說這條路線:

routes.MapRoute(
       "Image", 
       "{controller}/{action}/{lang}/{prod}", 
       new { controller = "Manuals", action = "Image", lang = "en-US", prod = "name" } 
     ); 

我在路徑做了小幅調整(如建議),因爲督促現在實際上帶有完整的文件名,包括擴展名:

public ActionResult Image(string lang, string prod) 
     { 
      var root = Server.MapPath("~/Views/Manuals/"); 
      var filepath = Path.Combine(root, lang, prod); // whatever creates your path here. 
      return File(filepath, "image/svg+xml"); 
     } 

然後在查看我能有這樣的路徑:

<embed type="image/svg+xml" src="@Url.Content("/Manuals/Image/da-DK/CheckRotation.svg")"></embed> 
+0

這條路線對我來說很不錯。我認爲問題在於你的行動。你是否返回FileResult而不是ViewResult? –

+0

不,實際上這只是視圖的路線,而我正在返回一個ActionResult。我實際上不知道如何處理SVG圖像的路由或操作。路由嘗試使用該控制器來處理SVG圖像,但如上所述,它不起作用。 – Anders

+0

這條路線看起來不錯。 ActionResult是FileResult和ViewResult的基類。你得到的錯誤是因爲你在你的方法中尋找一個視圖,而不是一個文件。 您是否需要動態加載SVG文件?無論如何,他們不應該在視圖文件夾中。如果您將它們放在內容文件夾中,則可以直接爲它們製作網址,而無需路由。 如果它們是動態的,那麼您正在尋找FileResult來加載SVG併發送字節。 SVG文件本身有動態嗎? –

回答

1

使用這條路線:

routes.MapRoute(
       "Parameter", 
       "{controller}/{action}/{lang}/{prod}", 
       new { controller = "Manuals", action = "Product", lang = "en-US", prod = "name" } 
     ); 

創建您的控制器這個動作ManualsController

public ActionResult Product(string lang,string prod){ 
    var root = Server.MapPath("~/views/manuals/"); 
    var filepath = Path.Combine(root,lang,prod,".svg"); // whatever creates your path here. 
    return File(filepath ,"your mime type"); 
} 

無需自定義視圖引擎。 FileResult僅用於這種場合。

+0

但我不能那樣做,那麼沒有任何行動方法來爲視圖提供自己的服務...... – Anders

+1

其實,我得到它的工作,我只需要做一些調整,看看我的編輯。謝謝! – Anders

+0

很高興爲您服務。 –

0

也許回答你的問題是在你的錯誤:

未找到'da-DK/ATEXSymbol.svg'或其主人的視圖或沒有視圖引擎支持搜索的地點

您是否想過插入custom view engine

我從來沒有創建過一個我自己&不能提供指導,所以這是一個不完整的答案(我可以稍後根據評論刪除)。這是一個有趣的問題,只要我能說出一個獨特的問題。我不知道誰會決定將這些項目「集體傾倒」,而不是按照慣例以這種方式工作。非常簡單,如果你使用網頁表單的話。

+0

我知道,這是非常規的,但不同的要求,不同的原因使它如此...我想過自定義視圖引擎以及自定義路由處理程序,但不幸的是,我還沒有能夠讓它工作到目前爲止。 – Anders

+0

我在我的問題中犯了一個小錯誤,現在編輯。這有幫助嗎? – Anders

+0

視圖文件擴展名必須來自視圖引擎。我認爲你將不得不走下自定義視圖引擎之路。 – danludwig