ASP.NET MVC视图无法显示数据库存储图片且RetrieveImage动作未触发求助
问题根因
你遇到的问题核心是img标签的请求路径配置错误,导致请求根本没有路由到RetrieveImage动作:
- 你写的
/Content/RetrieveImage/@item.Id路径中,/Content/是ASP.NET MVC默认的静态资源目录,ASP.NET运行时会默认把该路径下的请求当做静态文件处理,不会转发给控制器路由,所以你的RetrieveImage断点永远不会触发。 - 路径没有正确指向对应的控制器动作,就算没有静态资源拦截的问题,也找不到对应的处理逻辑。
- 浏览器请求该错误路径时返回404,img标签无法渲染资源,所以表现为Attachment列无内容展示。
解决方案
1. 修正视图中img标签的src路径
不要硬编码路径,用MVC提供的Url.Action辅助方法生成正确的动作路径,假设你的RetrieveImage动作写在HomeController里,就把img标签改成如下写法:
<img src="@Url.Action("RetrieveImage", "Home", new { id = item.Id })" alt="" height="50" width="50" />
如果你的控制器不是Home,替换成你实际的控制器名称即可。
2. 优化RetrieveImage动作的异常处理
当前代码如果查询不到对应id的附件会直接抛空引用异常,且返回null不符合HTTP响应规范,建议调整为:
public ActionResult RetrieveImage(int id) { var cover = db.PurchasingItems.Where(temp => temp.Id == id).Select(temp => temp.Attachment).FirstOrDefault(); if (cover != null) { return File(cover, "image/jpeg"); } // 没有找到图片时可以返回一个默认占位图,或者返回404 return HttpNotFound(); }
3. 可选校验路由配置
检查你的RouteConfig.cs中有没有特殊的路由规则拦截了对应路径的请求,确保控制器动作可以被正常路由到。
完成以上修改后刷新页面即可触发RetrieveImage动作,正常加载数据库存储的图片。
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

