Sau một vài lần lặp lại, tôi đã đưa ra một giải pháp khả thi, mặc dù tôi vẫn chưa thuyết phục được giải pháp tốt nhất của nó.
Ban đầu tôi đã theo đề xuất của Anton và chỉ đặt url hình ảnh tương ứng trong hành động điều khiển của tôi. Điều này đủ đơn giản với mã sau:
products.ForEach(p =>
{
p.Images[0].Url = _mediaService.GetImageUrl(p.Images[0], 200);
});
Tuy nhiên, tôi sớm nhận thấy rằng phương pháp này không mang lại sự linh hoạt mà tôi cần. Thường thì tôi sẽ cần phải hiển thị hình ảnh của các kích cỡ khác nhau và tôi không muốn sử dụng các thuộc tính của mô hình của tôi cho điều này như Product.FullSizeImageUrl, Product.ThumbnailImageUrl.
Theo như "Sản phẩm" có liên quan, nó chỉ biết về những hình ảnh được tải lên ban đầu.Nó không cần phải biết cách chúng ta thao tác và hiển thị chúng, hay chúng ta đang lưu chúng trong Amazon S3.
Trong biểu mẫu web, tôi có thể sử dụng điều khiển người dùng để hiển thị chi tiết sản phẩm và sau đó sử dụng điều khiển bộ lặp để hiển thị hình ảnh, đặt url hình ảnh lập trình theo mã phía sau.
tôi thấy rằng việc sử dụng các RenderAction trong ASP.NET MVC đã cho tôi sự linh hoạt tương tự:
điều khiển hành động:
[ChildActionOnly]
public ActionResult CatalogImage(CatalogImage image, int targetSize)
{
image.Url = _mediaService.GetImageUrl(image, targetSize);
return PartialView(image);
}
Dịch vụ Truyền thông:
public MediaCacheLocation CacheLocation { get; set; }
public string GetImageUrl(CatalogImage image, int targetSize)
{
string imageUrl;
// check image exists
// if not exist, load original image from store (fs or db)
// resize and cache to relevant cache location
switch (this.CacheLocation) {
case MediaCacheLocation.FileSystem:
imageUrl = GetFileSystemImageUrl(image, targetSize);
break;
case MediaCacheLocation.AmazonS3:
imageUrl = GetAmazonS3ImageUrl(image, targetSize);
break;
default:
imageUrl = GetDefaultImageUrl();
break;
}
return imageUrl;
}
Html helper:
public static void RenderCatalogImage(this HtmlHelper helper, CatalogImage src, int size) {
helper.RenderAction("CatalogImage", "Catalog", new { image = src, targetSize = size });
}
Cách sử dụng:
<%Html.RenderCatalogImage(Model.Images[0], 200); %>
Điều này giờ đây mang lại cho tôi sự linh hoạt mà tôi yêu cầu và sẽ hỗ trợ cả lưu vào bộ nhớ đệm hoặc lưu vào Amazon S3.
Có thể thực hiện với một số phương pháp tiện ích url để đảm bảo rằng URL hình ảnh được tạo hỗ trợ các thư mục SSL/ảo - Tôi hiện đang sử dụng VirtualPathUtility.
Cảm ơn Bến
Cảm ơn Anton, đây là cách tiếp cận tốt. Tôi nghĩ rằng tôi sẽ tạo một ViewModel mới cho điều này vì mô hình hiện tại của tôi là một IList có IList . Có vẻ tốt hơn để chia nhỏ điều này thành mô hình chế độ xem mới, nơi tôi có thể xác định những thứ như kích thước hình ảnh yêu cầu và chỉ có một hình ảnh cho mỗi sản phẩm (tất cả những gì tôi cần trong chế độ xem của mình). Tôi sẽ đăng mã của mình sau khi hoàn tất. –