Après plusieurs itérations, j'ai trouvé une solution réalisable, même si je ne suis toujours pas convaincu que c'est la meilleure solution.
À l'origine, j'ai suivi la suggestion d'Anton et j'ai simplement réglé l'URL de l'image en conséquence dans l'action de mon contrôleur. Ce fut assez simple avec le code suivant:
products.ForEach(p =>
{
p.Images[0].Url = _mediaService.GetImageUrl(p.Images[0], 200);
});
Cependant, je me suis vite trouvé que cette approche ne m'a pas donné la flexibilité dont je avais besoin. Souvent, j'ai besoin d'afficher des images de tailles différentes et je ne veux pas utiliser les propriétés de mon modèle comme Product.FullSizeImageUrl, Product.ThumbnailImageUrl.
En ce qui concerne «Produit», il ne connaît que les images qui ont été initialement téléchargées.Il n'a pas besoin de savoir comment nous les manipulons et les affichons, ou si nous les mettons en cache dans Amazon S3.
Dans les formulaires Web, je peux utiliser un contrôle utilisateur pour afficher les détails du produit, puis utiliser un contrôle répéteur pour afficher les images, en définissant les URLs de l'image dans le code par derrière.
Je trouve que l'utilisation de RenderAction dans ASP.NET MVC m'a donné une flexibilité similaire:
action Contrôleur:
[ChildActionOnly]
public ActionResult CatalogImage(CatalogImage image, int targetSize)
{
image.Url = _mediaService.GetImageUrl(image, targetSize);
return PartialView(image);
}
Media Service:
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;
}
aide Html:
public static void RenderCatalogImage(this HtmlHelper helper, CatalogImage src, int size) {
helper.RenderAction("CatalogImage", "Catalog", new { image = src, targetSize = size });
}
Utilisation:
<%Html.RenderCatalogImage(Model.Images[0], 200); %>
Cela me donne maintenant la flexibilité et je requiers soutiendra la mise en cache à la fois les images redimensionnées sur le disque ou enregistrer sur Amazon S3. Pourrait faire avec certaines méthodes d'utilitaire url pour s'assurer que l'URL de l'image générée prend en charge SSL/dossiers virtuels - J'utilise actuellement VirtualPathUtility.
Merci Ben
Merci Anton, c'est une bonne approche. Je pense que je vais créer un nouveau ViewModel pour cela car mon modèle actuel est un IList ayant IList . Il me semble préférable de mettre cela dans un nouveau modèle de vue où je peux définir des choses comme la taille d'image requise et avoir une seule image par produit (ce qui est tout ce dont j'ai besoin à mon avis). Je posterai mon code une fois terminé. –