C# Mvc发行候选版“;文件";行动结果

C# Mvc发行候选版“;文件";行动结果,c#,asp.net-mvc,C#,Asp.net Mvc,K。。。我显然做错了什么。我有一个简单的页面,上面有一个文件输入控件和一个提交按钮。我正在试用Mvc RC发布的新“文件”ActionResult 我只想在单击submit按钮时将所选文件上载到数据库。这一切都很好 然后,在页面刷新后,我想要一个图像来显示上传的结果图像。问题是图像没有呈现。。。我得到了破碎的图像 这是获取文件并将其发送回视图的部分 var a = Helper.Service.GetAttachmentById(id, MembershipProvider.Se

K。。。我显然做错了什么。我有一个简单的页面,上面有一个文件输入控件和一个提交按钮。我正在试用Mvc RC发布的新“文件”ActionResult

我只想在单击submit按钮时将所选文件上载到数据库。这一切都很好

然后,在页面刷新后,我想要一个图像来显示上传的结果图像。问题是图像没有呈现。。。我得到了破碎的图像

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

        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%>" />
“/>

想法….

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

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

你查过你的html源代码了吗

您可能应该做的是提供一个返回数据的方法,并将到该数据的路由传递给视图。生成的html“应该”如下所示:

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

因此,您必须执行以下步骤:

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

FileResult返回文件的ASCII或二进制内容。当你说要做以下事情时:

<img src="<%=Model.FileContent.FileContents %>" />
这指向以下(非常简单且不完整)示例控制器:

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

        return File(..);
    }
}

请注意,我为操作选择的名称很可能不太好,但它作为一个示例起到了作用。希望这有帮助。

还有另一个解决方案:

“/>

它在某些浏览器中工作,在某些浏览器中不工作(当然是IE)。但稳定的解决方案是Thomas J提到的。

在HtmlHelper上不存在任何称为RouteUrl的(扩展)方法。该方法是UrlHelper(Url.RouteUrl)的一部分我更新了我的帖子。你会注意到,我现在可以让图片出现在第一次上传时,但是,如果我去上传第二张图片,它应该会替换第一张图片,但是,它不会。图片不会刷新到新的图片,但是,我可以在db站点上看到记录已经更新/替换。想法…?可能是浏览器的缓存仍然保存着记录旧映像。清除缓存并检查问题是否仍然存在。