.
원래 Anton의 제안을 따르고 내 컨트롤러 작업 내에서 이미지 URL을 설정했습니다. 이것은 다음 코드로 충분히 간단했다 :
products.ForEach(p =>
{
p.Images[0].Url = _mediaService.GetImageUrl(p.Images[0], 200);
});
그러나, 나는 곧이 방법은 내게 필요한 유연성을 제공하지 않은 것으로 나타났다. 종종 다른 크기의 이미지를 표시해야하며 Product.FullSizeImageUrl, Product.ThumbnailImageUrl과 같은 모델의 속성을 사용하고 싶지 않습니다.
"제품"에 관한 한 원래 업로드 된 이미지에 대해서만 알고 있습니다.우리가 조작하고 표시하는 방법이나 Amazon S3에 캐싱하는지 여부는 알 필요가 없습니다.
웹 양식에서는 사용자 컨트롤을 사용하여 제품 세부 정보를 표시 한 다음 리피터 컨트롤을 사용하여 이미지를 표시하고 이미지 URL을 프로그래밍 방식으로 코드 뒤에 설정합니다.
컨트롤러 액션 :
[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 헬퍼 :
나는 ASP.NET MVC에서 RenderAction의 사용이 나에게 유사한 유연성을 준 것을 발견
public static void RenderCatalogImage(this HtmlHelper helper, CatalogImage src, int size) {
helper.RenderAction("CatalogImage", "Catalog", new { image = src, targetSize = size });
}
사용법 :
이 지금 내게 필요한 유연성을 제공하고 두 디스크에 크기가 조정 된 이미지를 캐싱 또는 아마존 S3에 저장 지원
<%Html.RenderCatalogImage(Model.Images[0], 200); %>
.
생성 된 이미지 URL이 SSL/가상 폴더를 지원하는지 확인하려면 url 유틸리티 메서드를 사용해야합니다. 현재 VirtualPathUtility를 사용하고 있습니다. 벤
감사합니다. Anton입니다.이 방법이 좋습니다. 현재 모델이 IList이고 IList가 인 IList이므로 새로운 ViewModel을 만들 것이라고 생각합니다. 필요한 이미지 크기와 같은 항목을 정의하고 제품 당 하나의 이미지 만 가질 수있는 새로운보기 모델로이 문제를 해결하는 것이 좋습니다. 한 번 완료되면 코드를 게시합니다. –