如何显示在 Asp.net MVC 中找不到的图像

Posted

技术标签:

【中文标题】如何显示在 Asp.net MVC 中找不到的图像【英文标题】:how to show image not found in Asp.net MVC 【发布时间】:2011-07-09 07:03:00 【问题描述】:

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

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

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

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

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

【问题讨论】:

你可以在图片标签上使用 属性,目的就是为了你所想。 @Oribt - alt 属性不会在丢失图像的位置显示图像,而是显示文本。 【参考方案1】:

最简单的方法是使用 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"); %>" />

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

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 生成等,则不能只使用字符串。

【讨论】:

+1 - 简单且可重复使用。您还可以有一个具有布尔标志的覆盖,以指示如果图像丢失,则应使用“未找到”图像。这在需要外观和感觉一致性的场景中很有用,当然 div.img css 可以控制丢失图像占位符的大小 谢谢吉姆!如果文件夹在不同文件夹中具有不同大小或该场景的任何命名约定,则也为文件夹添加了一种方法。 Here 是类似的解决方案,如果图像不存在,您可以使用 simple Jquery 解决方案 显示默认图像,检查 this ,希望对某人有所帮助。跨度> 【参考方案2】:

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

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

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

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

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

【讨论】:

我的想法和你一样。很好,我已经这样做了,但是最好从控制器传递图像,因为我需要的东西只能用我可以放在控制器中的代码来完成,而这些代码永远不能在 javascript 中完成。谢谢你的帮助。【参考方案3】:
    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));
    

【讨论】:

【参考方案4】:

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

控制器操作尝试从磁盘加载图像并将其作为FileResult 返回,或者如果磁盘中缺少文件,则返回占位符“找不到图像”图像。

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

【讨论】:

你的声音看起来很有趣。你能告诉我一些代码来检查控制器中的动作是否存在吗?

以上是关于如何显示在 Asp.net MVC 中找不到的图像的主要内容,如果未能解决你的问题,请参考以下文章

第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项

ASP.Net MVC:如何显示模型中的字节数组图像

使用 ASP.NET Core MVC,如何显示图像?

如何在 asp.net mvc 中显示来自 Amazon S3 的图像文件?

asp.net MVC列表视图中未显示图像

找不到静态图像的控制器路径? asp.net mvc 路由问题?