我結束了使用@ 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是什麼,所以我只是返回一個「無效請求」字符串給用戶。這很好,因爲我並不是真的想在這種情況下支持那些用戶:-)
我並沒有完全使用你的兩個選項,但這最終是解決它的解決方案:-)我'我會用細節發佈另一個問題的答案 – 2009-08-08 16:40:07