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

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

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

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

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

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

【问题讨论】:

  • 你可以在图片标签上使用 alt="" 属性,目的就是为了你所想。
  • @Oribt - alt 属性不会在丢失图像的位置显示图像,而是显示文本。

标签: c# asp.net-mvc web-config default imagesource


【解决方案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 属性设置为控制器操作,而不是直接设置图像。

    【讨论】:

    • 你的声音看起来很有趣。你能告诉我一些代码来检查控制器中的动作是否存在吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2012-03-25
    • 2022-01-08
    相关资源
    最近更新 更多