Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在渲染视图中已存在的图像字节数据_C#_Asp.net Mvc_Image Rendering - Fatal编程技术网

C# 正在渲染视图中已存在的图像字节数据

C# 正在渲染视图中已存在的图像字节数据,c#,asp.net-mvc,image-rendering,C#,Asp.net Mvc,Image Rendering,我是MVC(来自面向对象的C#exe应用)和Stackoverflow的新手。我一直在努力使用MVC高效地运行代码。我有从数据库返回的模型数据,以及一个字节字段,它是一个jpeg图像。在这个阶段,我给数据库打了一个电话 现在我坚持的是,一旦填充的模型数据出现在要渲染的视图中,我就不能简单地循环它并渲染每个数据行中的图像。我发现唯一可以让它工作的方法是调用并操作返回FileContentResult的方法,但这需要为每个新图像重新调用数据库 对于解决方案,我尝试了三种不同的方法,解决了以下问题:

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

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

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

  • 我似乎无法通过操作方法将字节数组传递回控制器 满足MVC希望如何在 看法Action方法只希望接受简单类型
  • 我显然不想让控制器返回数据库获取字节 我在视图中已经拥有的数据,尤其是 为模型数据中的每个条目涉及多个往返
  • 使用数据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");
        }
    
    
    [HttpGet]
    公共文件内容结果RenderMemberImage(字节[]pic)
    {
    返回新的FileContentResult(pic,“mime/jpeg”);
    }
    
    问题是您试图从浏览器向服务器发送字节数组。试着这样做:

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

    
    [HttpGet]
    公共文件内容结果RenderMemberImage(Guid picId)
    {
    var pic=new Models.Picture(picId);//或者从数据库中获取数据的方式
    返回新的FileContentResult(pic.ThumbnailData,“mime/jpeg”);
    }
    

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

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

    public class Child
    {
      public string ImageURL { set;get;}
      //other properties & construct etc 
    }
    public class Master
    {
      IEnumerable<Child> Children { set;get;}
    }
    
    您可以在这样的视图中使用它

    @foreach(child in Model.Children)
    {
      <img src="child.ImageURL" alt="loding.." />
    
    }
    
    @foreach(Model.Children中的子对象)
    {
    }
    
    谢谢你,但我认为你没有阅读我的全部帖子。我不想用字节数据返回服务器。我已经有了客户端上的字节数据。我想在客户端使用它。我试图找到一种不必返回数据库和web服务器的方法,但最好是,我根本不想返回服务器。这有意义吗?事实上,我确实读了你的全部文章,据我所知,除了数据URI方法之外,浏览器不支持你尝试工作的场景。您可能知道,图像标记的
    src
    属性通常会链接回服务器上的路由,该路由在HttpResponse中返回图像。如果你不想设置你的应用程序来实现这一点,你就要逆流而上,试图让它在多个浏览器上工作。谢谢。就像我在上面回答Shyju关于数据URI的问题一样,听起来我想做的事情在web世界中还没有准备好,我需要做的不是将图像存储在数据库中,而是从文件/应用程序服务器以标准http地址提供它们。你怎么看?我假设你有一个很好的理由将图像放入数据库(即,通过不同的控制器/操作很容易更新?),所以这没有问题。如果图像是静态的,并且仅在web应用程序更新时才会更改,那么出于效率考虑,我不会将它们存储在数据库中(IIS从文件系统返回图像与web应用程序/数据库相比,效果更好)。如果您确实想将它们存储在数据库中,那么您可以使用我上面的建议来执行此操作(即,图像由控制器作为“视图”结果返回)。这不是一个故意的原因,只是我必须操作字节数据来调整图像的大小,因此很容易在数据库中保留字段。。。除此之外,我一直乐于接受关于如何存储和检索它的建议。我不是一个经验丰富的web开发人员,我甚至已经有一段时间没有编写过许多桌面应用程序了,所以这就像往常一样是一个学习曲线。谢谢大家。是的,这大概就是我对上面提到的问题3所做的。我认为数据URI在未来会被更多地使用,但现在IE已经落后于“时代”。听起来我需要做的不是将图像存储在数据库中,而是从文件/应用服务器以标准http地址提供它们。你们觉得怎么样?谢谢你的反馈。
    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.." />
    
    }