0

我是 MVC(来自面向对象的 C# exe 应用程序)和 Stackoverflow 的新手。我一直在努力尝试使用 MVC 有效地运行代码。我有从数据库返回的模型数据,以及该数据是一个字节字段,它是一个 jpeg 图像。在这个阶段,我已经对数据库进行了一次调用......

现在我坚持的是,一旦填充的模型数据在要渲染的视图中,我不能简单地循环它并在每个数据行中渲染图像。我发现使它工作的唯一方法是调用返回 FileContentResult 的 Action 方法,但这需要重新调用每个图像的数据库。

对于解决方案,我尝试了三种不同的方法来解决以下问题:

  1. 我似乎无法通过 Action 方法将字节数组传递回控制器,以满足 MVC 希望在视图中接收 FileContentResult 的方式。Action 方法只想接受简单类型。
  2. 我显然不想让控制器返回数据库以获取视图中已有的字节数据,尤其是当这将涉及模型数据中的每个条目的多次往返时。
  3. 使用 Data Uri 是可行的,但还没有足够多的浏览器支持它。

有人可以告诉我处理此类问题的最佳方法是什么吗?我是否需要处理问题 1 或 2,或者我是否缺少其他方法?

这是我最初在问题 1 中尝试使用的代码,用于将字节数组传回控制器,以便渲染 FileContentResult:

<img src=" @{Html.RenderAction("RenderMemberImage", "Home", new { @pic = x.ThumbnailData });}" />

[HttpGet]
    public FileContentResult RenderMemberImage(byte[] pic)
    {
        return new FileContentResult(pic, "mime/jpeg");
    }
4

2 回答 2

1

一种可能的解决方案是将字节转换为 Base64 表示并将其保留为子对象的属性

public class Child
{
  public string ImageURL { set;get;}
  //other properties & construct etc 
}
public class Master
{
  IEnumerable<Child> Children { set;get;}
}

在您的 GET 操作中

public ActionResult SomeGetACtion()
{
  var master=new Master();

  foreach(itm in someCollection)
  {
    var child=new Child();

    byte[] imageData = GetImageByte(); //get your byte data;
    string imageBase64 = Convert.ToBase64String(imageData);
    child.ImageURL = string.Format("data:image/gif;base64,{0}", imageBase64);
    master.Children.Add(byte);
  }
}

您可以像这样在视图中使用它

@foreach(child in Model.Children)
{
  <img src="child.ImageURL" alt="loding.." />

}
于 2012-07-06T17:28:46.787 回答
0

问题是您正在尝试将字节数组从浏览器发送到服务器。尝试这样的事情:

(我还没有编译这个,但它应该很接近)

<img src=" @{Html.Action("RenderMemberImage", "Home", new { @picId = x.Id });}" />

[HttpGet]
public FileContentResult RenderMemberImage(Guid picId)
{
    var pic = new Models.Picture(picId);//or however you get your data out of the DB
    return new FileContentResult(pic.ThumbnailData , "mime/jpeg");
}

基本上,对于页面上的每个图像,浏览器都会向服务器发出请求以获取图像。

于 2012-07-05T18:55:34.147 回答