2009-08-08 38 views
6

Đây là những gì tôi muốn làm. Tôi có nội dung mà tôi đang viết để xem. Nội dung này có các tham chiếu hình ảnh có liên quan đến tài liệu. Vì vậy, ví dụ, nếu tôi nhìn vào URL sau:Cung cấp hình ảnh từ cùng một đường dẫn URL được định tuyến trong ASP.NET MVC

http://localhost/article/8AB98/ 

Nội dung có thể có một hình ảnh trong các hình thức sau đây:

<img src="myimage.png" /> 

Điều này sẽ rõ ràng là làm cho trình duyệt để truy vấn cho hình ảnh tại URL sau:

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

Tuy nhiên, do định tuyến mvc, hình ảnh này sẽ không được tìm thấy. Bạn có biết một cách đơn giản mà tôi có thể khiến URL đó trả về đúng hình ảnh cho trình duyệt không?

xin lưu ý: thực sự quan trọng là đánh dấu vẫn bị ảnh hưởng từ bản gốc ... điều này có nghĩa là bằng cách nào đó viết lại url hình ảnh để chúng trỏ đến một thư mục khác bên ngoài URL của chế độ xem hiện tại. .

Cảm ơn !!

Trả lời

5

Tôi giả định rằng khi bạn nói "nó thực sự quan trọng là đánh dấu vẫn bị ảnh hưởng từ bản gốc" bạn có nghĩa là

<img src="myimage.png" /> 

là những gì phải được trả lại cho trình duyệt và do đó bạn cần phải lừa máy chủ web đưa URL yêu cầu của

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

và chỉ sử dụng thông tin đó để tìm đúng hình ảnh, bất cứ nơi nào bạn lưu trữ và trả lại trình duyệt.

Hai tùy chọn cần lưu ý, nhưng thật khó để biết nên giới thiệu gì vì bạn chưa biết vị trí lưu trữ hình ảnh.

Lựa chọn 1 - Url Ổ ghi

Mua một bản sao của ISAPI_Rewrite và có tất cả các url có thể đáp ứng các tiêu chí trên được viết lại để họ đi có được hình ảnh bất cứ nơi nào nó sống. Thông tin thêm về ISAPI_Rewrite here.

Lựa chọn 2 - Tuỳ chỉnh HttpHandler

Bạn có thể viết một HttpHandler ánh xạ tới tất cả các yêu cầu tập tin PNG rằng phân tích cú pháp URL yêu cầu và làm những gì nó cần phải làm gì để tìm hình ảnh, sau đó trả lại cho dòng phản ứng . Nhược điểm của điều này là bạn phải nói với IIS để ánh xạ tất cả các yêu cầu PNG để đi qua aspnet_isapi.dll có thể là một bummer hiệu suất.

Tôi vẫn không chắc liệu tôi có hiểu chính xác vấn đề của bạn hay không nhưng tôi hy vọng điều này sẽ hữu ích. Chúc may mắn.

+0

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 –

1

Một cách để làm điều đó sẽ được đặt trong một IgnoreRoute cho các tập tin hình ảnh:

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

Bạn có thể sử dụng phương pháp() Url.Content.

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

Điều đó sẽ giải quyết url từ gốc ứng dụng.

+1

Tôi muốn bị cám dỗ để viết một helper cũng như vậy mà bạn chỉ có thể có Html.Image ("~/images/myimage. png "," myAltText "); Và phương pháp trợ giúp của bạn sẽ trả về cơ bản mã của Phil. –

+0

Xin chào Phil ... thay đổi URL từ "myimage.png", thành url.content sẽ trả lại là không thể, vì đánh dấu nội dung không phải là của tôi để thay đổi. Ngoài thực tế đó, tôi thực sự cần đánh dấu này () để được hiển thị cho trình duyệt (như @thinkzig đã đề cập) –

-1

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 đó :-)

Các vấn đề liên quan