6

我有一个 asp.net mvc 项目。在一个特定的视图中,我从我的项目内不同的不同文件夹中调用这四个图像。

有时找不到图像。我想为每个文件夹设置一个图像,因为所有 4 个文件夹都包含不同大小的图像,所以我需要为每个文件夹设置特定大小的图像。

当图像找不到任何方法时,我如何显示默认图像。我的意思是当目录没有我在视图中调用的图像时调用 none.png。

在找不到图像的情况下,他们是否可以通过任何方式显示图像。

在 asp.net 4 MVC 3 中执行此操作的任何方法。使用 web.config 或设置其他任何内容。

4

4 回答 4

7

最简单的方法是使用 html 助手。请注意在显示图像文件名之前检查文件系统的额外性能损失。不过,点击量很小,因此除非您获得非常高的流量,否则您不会注意到任何问题。然后您可以实现某种缓存,以便应用程序“知道”文件是否存在。

您可以为此使用自定义 html 帮助程序

public static class ImageHtmlHelpers
{
   public static string ImageUrlFor(this HtmlHelper helper, string contentUrl)
   {
       // Put some caching logic here if you want it to perform better
       UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
       if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
       {
           return urlHelper.Content("~/content/images/none.png");
       }
       else
       {
           return urlHelper.Content(contentUrl);
       }
   }
}

然后在您看来,您可以使用以下方法制作网址:

<img src="<% Html.ImageUrlFor("~/content/images/myfolder/myimage.jpg"); %>" />

编辑: 正如吉姆指出的,我还没有真正解决尺寸问题。我个人使用自动大小请求管理/大小,这是另一回事,但如果您担心文件夹/大小,只需传递该信息以构建路径。如下:

public static class ImageHtmlHelpers
{
   public static string ImageUrlFor(this HtmlHelper helper, string imageFilename, ImageSizeFolderEnum imageSizeFolder)
   {
       UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
       string contentUrl = String.Format("~/content/userimages/{0}/{1}", imageSizeFolder, imageFilename);
       if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
       {
           return urlHelper.Content(String.Format("~/content/userimages/{0}/none.png", imageSizeFolder));
       }
       else
       {
           return urlHelper.Content(contentUrl);
       }
   }
}

然后在您看来,您可以使用以下方法制作网址:

<img src="<% Html.ImageUrlFor("myimage.jpg", ImageSizeFolderEnum.Small); %>" />

如果文件夹是固定集,则建议使用 Enum 进行更好的编程控制,但是对于快速而讨厌的方法,这不是为什么如果文件夹是 db 生成的等,您不能只使用字符串的原因。

于 2011-03-05T07:03:59.230 回答
1

不太了解 MVC,但这是我的想法:

有一个特定的控制器,它可以根据您的逻辑获取图像。就像迈克尔说的那样,在成功的审计中返回一些东西(图像)——意思是如果找到图像。如果未找到返回状态码 404 或类似的东西。

通过客户端上的 javascript 处理其余部分。所以在 img 标签中为 onerror 事件写一些东西。可以用您的图像未找到海报图像文件替换 img 源。这里有点(但不完全是)如何通过 jquery 做到这一点。

$(function(){
    $('#myimg').error(function(){
        $('#result').html("image not found");
    });
});

PS: http: //jsfiddle.net/Fy9SL/2/如果您对 jquery 代码的完整演示感兴趣。

于 2011-03-05T06:33:45.440 回答
1
    public static MvcHtmlString Image(this HtmlHelper helper, string src, string alt)
    {
        var builder = new TagBuilder("img");

        // Put some caching logic here if you want it to perform better
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(src)))
        {
            src = urlHelper.Content("~/content/images/none.png");
        }
        else
        {
            src = urlHelper.Content(src);
        }

        builder.MergeAttribute("src", src);
        builder.MergeAttribute("alt", alt);
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }
于 2011-06-23T09:13:17.080 回答
0

您可以使控制器操作返回 a FileResult,并接受string描述图像路径的类型参数。

控制器操作尝试从磁盘加载图像并将其作为FileResult.

然后要显示图像(或其占位符),您可以将元素的src属性设置img为控制器操作,而不是直接设置图像。

于 2011-03-05T06:18:32.793 回答