Tôi đã kết thúc bằng cách sử dụng giải pháp của @ thinkzig, mặc dù trong một thời trang hơi khác. Sử dụng FileContent từ hội đồng MVC Futures, tôi vừa thêm một tuyến đường khác để xử lý hình ảnh.
routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" });
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" });
phương pháp hành động mới này chỉ đơn giản là xây dựng các filepath dựa trên articleID và hình ảnh và tên:
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");
}
Có một điều nhỏ khác tôi phải đấu tranh với. Nếu người dùng truy cập vào bài viết mà không cần dấu gạch chéo (http://localhost/article/8AB98
), thì trình duyệt nghĩ rằng articleID là tệp và cố gắng tìm thư mục sai hình ảnh (http://localhost/article/img.png
).
Rất may trong trường hợp đó, mvc định tuyến yêu cầu đến hành động Điều với tên hình ảnh làm thông số "id", vì vậy tôi có thể chỉ cần tìm "." trong id và sau đó sử dụng hành động Image thông thường để xử lý nó.
trong hành động Điều:
if (id.Contains("."))
{
return RedirectToImage(id);
}
Và sau đó mã redirecttoimage mà hiểu ra ID và tên file
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);
}
Bạn sẽ lưu ý rằng tôi dựa vào giới thiệu url để nhận ID bài viết thực tế. Nếu người dùng cố gắng nhấp chuột phải vào hình ảnh (khi được xem không có dấu gạch chéo) và chọn "mở hình ảnh trong tab mới", thì tôi không biết cách ID bài viết là gì, vì vậy tôi chỉ trả lại "yêu cầu không hợp lệ" chuỗi cho người dùng. Đó là tốt bởi vì tôi không thực sự cố gắng để hỗ trợ những người dùng trong tình huống đó :-)
Tôi đã không sử dụng chính xác hai tùy chọn của bạn, nhưng cuối cùng giải pháp này đã giải quyết :-) Tôi ' sẽ đăng câu trả lời khác cho câu hỏi với các chi tiết –