2009-08-08 98 views
6

以下是我想要做的。我有內容,我正在寫出一個看法。該內容具有與文檔相關的圖像引用。因此,舉例來說,如果我期待在以下網址:從ASP.NET MVC中的相同路由URL路徑提供圖像

http://localhost/article/8AB98/ 

內容可能有以下形式的圖像:

<img src="myimage.png" /> 

這顯然導致瀏覽器查詢圖像在以下URL:

http://localhost/article/8AB98/myimage.png 

但是,由於mvc路由,此圖像將不會被找到。你知道一個簡單的方法,我可以使該URL將正確的圖像返回給瀏覽器嗎?

請注意:它實際上是很重要的標記仍然從原來的不變......這意味着,在某種程度上重新寫入圖像的網址,以便它們指向另一個文件夾中當前視圖的URL外部是不幸出了問題。

謝謝!

回答

5

我假設當你說「它實際上是很重要的標記仍然從原來的不變」你的意思是

<img src="myimage.png" /> 

就是必須要呈現給瀏覽器,所以你需要欺騙Web服務器到取的

http://localhost/article/8AB98/myimage.png 

請求的URL,並且只使用信息來找到正確的圖像,只要您有它保存,並返回給瀏覽器。

想到兩個選項,但很難知道推薦哪個選項,因爲您沒有說出圖像的存儲位置。

選項1 - URL重寫

購買的ISAPI_Rewrite的副本,並具有滿足改寫上述標準,讓他們去獲取圖像是任何一個的所有URL。更多關於ISAPI_Rewrite here

選項2 - 自定義的HttpHandler

你可以寫映射到解析請求的URL和做的事情需要做,找到圖像,然後返回響應流中的所有PNG文件請求一個HttpHandler 。這樣做的缺點是,你必須告訴IIS映射所有的PNG請求,以通過aspnet_isapi.dll,這可能是一個性能不濟的人。

我仍然不確定如果我正確理解您的問題,但我希望這有助於。祝你好運。

+0

我並沒有完全使用你的兩個選項,但這最終是解決它的解決方案:-)我'我會用細節發佈另一個問題的答案 – 2009-08-08 16:40:07

1

一種方式做這將是擺在IgnoreRoute爲圖像文件:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("article/{ArticleID}/{name}.png"); 
    ... 
6

可以使用Url.Content()方法。

<img src="<%= Url.Content("~/images/myimage.png") %>" /> 

這將從應用程序根解析url。

+1

我很想寫一個幫手,以便你可以只有Html.Image(「〜/ images/myimage。 png「,」myAltText「);而且你的幫手方法基本上會返回Phil的代碼。 – 2009-08-08 11:40:38

+0

嗨菲爾...將URL從「myimage.png」更改爲url.content將返回的內容是不可能的,因爲內容的標記不是我可以更改的。除此之外,我實際上需要將這個標記()呈現給瀏覽器(正如@thinkzig所提到的) – 2009-08-08 15:33:48

-1

我結束了使用@ thinkzig的解決方案,儘管以稍微不同的方式。使用MVC Futures程序集中的FileContent,我只是添加了另一條路徑來處理圖像。

routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" }); 
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" }); 

這種新的操作方法簡單地構建了基於該條款ArticleID和圖像名稱的文件路徑:

public ActionResult Image(string id, string image) 
{ 
    string articlePath = Server.MapPath("~/views/article/"); 
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image)); 
    return this.File(filePath, "image"); 
} 

還有另外一個小東西我不得不與之抗衡。如果用戶訪問文章而沒有尾部斜線(http://localhost/article/8AB98),則瀏覽器認爲articleID是該文件,並嘗試查找圖像錯誤的文件夾(http://localhost/article/img.png)。

幸運的是,在這種情況下,mvc將請求路由到文章操作,圖像名稱作爲「id」參數,因此我可以簡單地查找「。」。在id中,然後使用常規的Image操作來處理它。

在第二十行動

if (id.Contains(".")) 
{ 
    return RedirectToImage(id); 
} 

然後是redirecttoimage代碼計算出的ID和文件名

private ActionResult RedirectToImage(string id) 
{ 
    if (Request.UrlReferrer == null) 
    { 
     return Content("invalid request"); 
    } 

    var referrer = Request.UrlReferrer.ToString(); 
    if (referrer.Contains("?")) 
    { 
     referrer = referrer.Split('?')[0]; 
    } 

    var realId = Path.GetFileName(referrer); 
    return this.Image(realId, id); 
} 

你會注意到,我靠的URL引薦獲取實際的文章ID。如果用戶試圖右擊圖像(當查看時沒有結尾的斜線)並選擇「在新標籤中打開圖像」,那麼我無法知道文章ID是什麼,所以我只是返回一個「無效請求」字符串給用戶。這很好,因爲我並不是真的想在這種情況下支持那些用戶:-)