【问题标题】:Mvc Release Candidate "File" ActionResultMvc 发布候选“文件”ActionResult
【发布时间】:2009-02-01 12:46:52
【问题描述】:

K...我在做一些明显错误的事情。我有一个简单的页面,上面有一个文件输入控件和一个提交按钮。我正在尝试使用 Mvc RC 发布的新“文件”ActionResult...

所有,我想要发生的是当单击提交按钮时,选定的文件被上传到数据库。这一切都很好......

然后,在页面刷新后,我想要一张图片来显示上传的结果图片。问题是图像未呈现...我得到损坏的图像...

这是获取文件并将其发送回视图的部分...

        var a = Helper.Service.GetAttachmentById(id, MembershipProvider.SecurityTicket);

        if (a == null)
        {
            return View(new ImagePlaceHolderViewData(new { Id = id }));
        }
        return View(new ImagePlaceHolderViewData(new { Id = a.Id, Image = a, FileContent = File(a.Data, a.ContentType) }));

然后在视图中我有一个像这样的图像标签......

<img src="<%=Model.FileContent.FileContents %>" />

我也试过了……

<img src="<%=Model.FileContent%>" />

想法..??

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    FileResult 返回文件的 ASCII 或二进制内容。当您说执行以下操作时:

    <img src="<%=Model.FileContent.FileContents %>" />
    

    您正在尝试将二进制图像数据推送到src 属性中。这永远不会奏效,因为src 必须是 URL 或图像的路径。

    有几种方法可以做你想做的事,在这种情况下最正确的解决方案是创建一个新的控制器来返回二进制数据,就像你正在尝试的那样,然后你将 src 属性设置为在新控制器上纠正操作的路径。例如:

    <img src="/image/result/12345" />
    

    这指向以下(非常简单且不完整的)示例控制器:

    public class ImageController : Controller
    {
        public ActionResult Result(int resultID)
        {
            // Do stuff here...
    
            return File(..);
        }
    }
    

    请注意,我为该操作选择的名称很可能不是什么好东西,但它可以作为示例。希望这对您有所帮助。

    【讨论】:

      【解决方案2】:

      我认为这很简单:img 标签的 src 属性需要一个 URL。您在这里所做的只是将 FileStream 对象放在那里(隐式调用该对象的 ToString 方法)。您生成的 html 可能是这样的:

      <img src="FileStream#1" />
      

      你检查了你的 html 源代码吗?

      您可能应该做的是提供一个返回数据的方法,并将路由传递给您的视图。您生成的 html“应该”看起来像这样:

      <img src="/Images/View/1" />
      

      所以,你必须做的步骤是:

      • 在控制器上创建一个返回 FileContentResult 的方法
      • 将您的图像 ID 传递给您的视图
      • 使用 Url.RouteUrl 生成一个 url,您可以将其放入您的 img 标签中,它指向返回您的图像数据的方法。

      【讨论】:

      • HtmlHelper 上不存在名为 RouteUrl 的任何(扩展)方法。该方法是 UrlHelper (Url.RouteUrl.) 的一部分
      【解决方案3】:

      还有另一种解决方案:

      <img src="data:image/gif;base64,<%=Convert.ToBase64(Model.FileContent)%>"/>
      

      它适用于某些浏览器,但不适用于某些浏览器(IE!当然)。但稳定的解决方案就是 Thomas J 提到的。

      【讨论】:

      • 我更新了我的帖子。您会注意到,我现在可以让图像出现在第一次上传,但是,如果我去上传第二张图像,它应该替换第一个,但是它不会。图像不会刷新到新的但是,我可以在数据库站点上看到记录已被更新/替换。想法...?
      • 可能是浏览器的缓存仍然保存旧图像。清除缓存,检查问题是否仍然存在。
      猜你喜欢
      • 1970-01-01
      • 2013-08-05
      • 2014-02-11
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多