如何显示在 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 项目中找不到它的依赖项