После нескольких итераций я нашел работоспособное решение, хотя я все еще не уверен, что это лучшее решение.
Первоначально я последовал совету Антона и просто установил URL изображения в рамках действия моего контроллера.Это было достаточно просто с помощью следующего кода:
products.ForEach(p =>
{
p.Images[0].Url = _mediaService.GetImageUrl(p.Images[0], 200);
});
Однако вскоре я обнаружил, что этот подход не дает мне необходимой гибкости.Часто мне нужно отображать изображения разных размеров, и я не хочу использовать для этого свойства моей модели, такие как Product.FullSizeImageUrl, Product.ThumbnailImageUrl.
Что касается «Продукта», то он знает только об изображениях, которые были первоначально загружены.Ему не нужно знать, как мы манипулируем и отображаем их, или кешируем ли мы их в Amazon S3.
В веб-формах я мог бы использовать пользовательский элемент управления для отображения сведений о продукте, а затем использовать элемент управления повторителя.чтобы отображать изображения, устанавливая URL изображений программно в коде позади.
Я обнаружил, что использование RenderAction в ASP.NET MVC дало мне аналогичную гибкость:
Действие контроллера:
[ChildActionOnly]
public ActionResult CatalogImage(CatalogImage image, int targetSize)
{
image.Url = _mediaService.GetImageUrl(image, targetSize);
return PartialView(image);
}
Служба мультимедиа:
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:
public static void RenderCatalogImage(this HtmlHelper helper, CatalogImage src, int size) {
helper.RenderAction("CatalogImage", "Catalog", new { image = src, targetSize = size });
}
Использование:
<%Html.RenderCatalogImage(Model.Images[0], 200); %>
Теперь это дает мне необходимую гибкость и будет поддерживатьи кэширование измененных изображений на диск, или сохранение в Amazon S3.
Может быть с некоторыми методами утилит URL, чтобы гарантировать, что сгенерированный URL-адрес изображения поддерживает SSL / виртуальные папки - в настоящее время я использую VirtualPathUtility.
Спасибо, Бен