我是MVC(来自面向对象的C#exe应用程序)和Stackoverflow的新手。我一直在努力尝试使用MVC高效运行代码。我有从数据库返回的模型数据,以及该数据是一个字节字段,是一个jpeg图像。在这个阶段,我打电话给数据库......
现在我坚持的是,一旦填充的模型数据在要渲染的视图中,我就不能简单地遍历它并在每个数据行中渲染图像。我发现使其工作的唯一事情是调用和Action方法返回FileContentResult,但这需要重新调用每个图像的数据库。
对于解决方案,我尝试了三种不同的方法来解决以下问题:
有人能告诉我处理这类问题的最佳方法是什么?我是否需要处理问题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");
}
答案 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");
}
基本上,对于页面上的每个图像,浏览器都会向服务器发出请求以获取图像。