【问题标题】:How to display a default image in case the source does not exists如果源不存在,如何显示默认图像
【发布时间】:2013-11-24 18:01:08
【问题描述】:

我在 myasp.net MVC Web 应用程序中有以下代码:-

 <a href="~/Content/uploads/@(item.ID).png"><img class="thumbnailimag" src="~/Content/uploads/@(item.ID).png"  /></a>   @Html.ActionLink(item.Name,"Details","DataCenter", new{id = item.ID},null)

还有以下 CSS:

.thumbnailimag {
    width:30px;
    height:30px;
    border:thin blue;
    background-image:url("/Content/uploads/virtual-data-center.jpg");
}

但如果图像不存在,每个 Bowser 都会以不同的方式处理它。我设置了一个背景图像,但仍然在 IE 上它会在默认图像上显示一个“X”,如下所示:-

如果 src 不存在,是否有办法显示默认图像?

【问题讨论】:

标签: html css asp.net-mvc


【解决方案1】:

当然,供您使用图片:

&lt;img src="fails/to/load.png" onerror="this.src='path/to/replacement/image.jpg'" /&gt;

CSS 中没有解决方案,它需要将 JS 应用于每个 &lt;img&gt; 标签或顶级处理程序来替换所有图像的 onerror 事件。

【讨论】:

  • +1 虽然我害怕if error.jpg does not exist
  • 简单且最佳的解决方案!谢谢。
  • +1 感谢@SW4(以及 John John 提出的问题)为我节省了大量时间/代码/实验/失败/心碎。
  • 或许onerror="this.onerror = null; this.src='path/to/replacement/image.jpg'"
【解决方案2】:

你可以尝试添加一些js,例如给img标签添加一个事件监听器:

<img id="something" data-isloaded="false" onload="$(this).data('isloaded', 'true')" />

然后你可以检查图像是否加载:

if ($('#myimage').data('isloaded') === 'false' ) {
    // not loaded, do stuff here
    // add some replacement thumbnail
    // or set background image to the parent element
}

【讨论】:

    【解决方案3】:

    处理这个服务器端要好得多:

    public static class HtmlHelperExtensions
    {
        public static string ImageOrDefault(this HtmlHelper helper, string filename)
        {
            var imagePath = uploadsDirectory + filename + ".png";
            var imageSrc = File.Exists(HttpContext.Current.Server.MapPath(imagePath))
                               ? imagePath : defaultImage;
    
            return imageSrc;
        }
    
        private static string defaultImage = "/Content/DefaultImage.png";
        private static string uploadsDirectory = "/Content/uploads/";
    }
    

    然后你的视图被简化为:

    <img src="@Html.ImageOrDefault(item.ID)" />
    

    【讨论】:

    • 但是在 Controller 文件夹下还是在 Model 文件夹下创建此类更好?谢谢
    • @JohnJohn 我倾向于创建一个名为ExtensionsHelpers 的新文件夹并将其放入其中。不过,为了使其正常工作,您需要将命名空间添加到您的 ~/Views/Web.config 文件中(确保它是那个文件,而不是项目根目录中的 Web.config)。只需查找元素&lt;system.web.webPages.razor&gt;。在那里,您会发现已经添加了一些命名空间。在这些下,您可以添加类似:&lt;add namespace="YourProject.Extensions" /&gt;.
    猜你喜欢
    • 2015-08-10
    • 2018-03-11
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2013-05-27
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多