渲染图像视图中已有的字节数据

时间:2012-07-01 23:57:15

标签: c# asp.net-mvc image-rendering

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

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

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

  1. 我似乎无法通过Action方法将字节数组传回控制器 满足MVC想要接收FileContentResult的方式 视图。 Action方法只想接受简单类型。
  2. 我显然不想让控制器返回数据库中的字节 我在View中已经拥有的数据,尤其是在这种情况下 涉及我的模型数据中每个条目的几次往返。
  3. 使用Data Uri可以使用,但目前还没有足够的浏览器支持。
  4. 有人能告诉我处理这类问题的最佳方法是什么?我是否需要处理问题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");
        }
    

2 个答案:

答案 0 :(得分: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.." />

}

答案 1 :(得分: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");
}

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