2009-01-23 55 views
5

Có một thư mục trong tiêu chuẩn ASP.NET mẫu "Content", nơi hầu hết mọi người dường như được đưa vào các hình ảnh và các file css, vvThực hành đúng cho nơi đặt hình ảnh và tệp tĩnh trong ứng dụng ASP.NET MVC?

Đối với biểu tượng dụ stackoverflow của:

alt text http://www.stackoverflow.com/Content/Img/stackoverflow-logo-250.png

thực sự là đề cập đến với một đường dẫn máy chủ có chứa 'nội dung' trong URL (chỉ cần làm View Source cho bất kỳ trang SO nào và bạn sẽ thấy điều này). Vì vậy, họ rõ ràng đang lưu trữ hình ảnh trong "content/images/...".

src="/Content/Img/stackoverflow-logo-250.png" 

Tôi không đặc biệt thích điều này. HTML của tôi kết thúc với /content trên tất cả, và hơi khó di chuyển các trang hiện có chỉ có/hình ảnh. May mắn thay, biểu định kiểu của tôi không kết thúc với content trên tất cả, miễn là tôi lưu nó trong content\site.css.

Cách khác là đặt một thư mục images vào thư mục gốc, nhưng sau đó bạn nhận được images ở cùng mức với ControllersViews là khá khủng khiếp.

tôi băn khoăn về việc cố gắng để thêm một quy tắc chuyển hướng như thế này:

routes.RedirectRoute(
    "images rule", 
    "Images/{*}", 
    "Content/Images/{1}"); // this is NOT valid code - I made it up 

Nhưng mà công việc mã doesnt vì tôi chỉ cần thực hiện nó lên. Tôi có thể sử dụng một plug-in chuyển hướng/viết lại của bên thứ ba nhưng tôi muốn giữ mọi thứ 'thuần khiết' trong mô hình MVC.

Có ai khác tìm thấy trong khu vực này? Hoặc là mọi người chỉ hài lòng với thêm ("/content".length) byte trong nguồn của họ cho mọi hình ảnh mà họ phân phối.

Trả lời

3

Thành thật mà nói, tôi không nghĩ rằng nó thực sự cần phải lo lắng về ... "/ Nội dung" sẽ đóng góp khá nhỏ vào kích thước trang của bạn. Nếu bạn vẫn muốn làm điều đó, đây là một số lựa chọn:

Phương án 1, nếu bạn đang chạy trên máy chủ của mình, là để kiểm tra các mô-đun IIS URL Rewrite: http://learn.iis.net/page.aspx/460/using-url-rewrite-module/

Lựa chọn 2 là sử dụng một trong hai RedirectResult, hoặc ContentResult, để đạt được hiệu quả tương tự trong khuôn khổ MVC

Thứ nhất, bản đồ một "catchall" đường dưới "Images /" tới hành động điều khiển, như vậy

routes.MapRoute("ImageContent", 
       "Images/{*relativePath}", 
       new { controller = "Content", action = "Image" }) 

Hãy chắc chắn rằng nó là ở trên tiêu chuẩn "{controller}/{action}/{id}" ro của bạn ute. Sau đó, trong ContentController (hoặc bất cứ nơi nào bạn quyết định đặt nó):

public ActionResult Image() { 
    string imagePath = RouteData.Values["relativePath"] 
    // imagePath now contains the relative path to the image! 
    // i.e. http://mysite.com/Images/Foo/Bar/Baz.png => imagePath = "Foo/Bar/Baz.png" 
    // Either Redirect, or load the file from Content/Images/{imagePath} and transmit it 
} 

Tôi đã làm một bài kiểm tra nhanh và dường như nó hoạt động. Hãy cho tôi biết trong phần bình luận nếu bạn có bất kỳ vấn đề gì!

+0

thực sự đáng lo ngại về số lượng byte bổ sung là nỗ lực của tôi trong trò đùa. tôi chỉ không thích xem .nó chỉ không cảm thấy đúng, nhưng nếu thats các quy ước thành lập thì thats ok. thực hiện của bạn trông đẹp và sạch sẽ mặc dù. cảm ơn –

2

Thường thì tốt hơn là đặt hình ảnh trong một miền phụ khác. Lý do cho điều này là trình duyệt giới hạn số lượng kết nối cho mỗi URL. Vì vậy, nếu bạn sử dụng http://static.mysiste.com bây giờ trình duyệt có thể mở nhiều kết nối đồng thời hơn do nó đang ở trong một URL khác.

+0

tôi thực sự đã biết về điều đó ngày hôm qua. tôi không thể tin rằng IE STILL chỉ tải xuống 2 tệp tại một thời điểm. tôi biết nó bị giới hạn - nhưng HAI tệp !! –

+0

tôi có lẽ sẽ phải viết một trình trợ giúp Html để viết ra một thẻ hình ảnh được tạo ra để xác định gốc cho hình ảnh của tôi. mà sẽ có thêm tiền thưởng của việc ngừng thêm 'nội dung' cho tất cả hình ảnh của tôi. Html.Image ("hình ảnh/nền/1.jpg") mà sẽ đi đến cấu hình cho đường dẫn cơ sở –

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