我有一个生成图像的ASP.NET MVC控制器(它们存储在内存中,我不想将它们存储在硬盘上),应该将它们返回到我的视图中。
问题是:我不知道如何从一个控制器方法返回多个图像(我想在1个视图中显示图像)。我知道我可以使用FileResult
返回单个图像,但我无法找到(不在google / stackoverflow上)如何从同一方法返回多个图像。无法在多种方法中拆分方法。哦,所有图像都转换为byte[]
,但必要时可以反转。
答案 0 :(得分:3)
我认为你可以用另一种方式解决它,而不是返回多个图像,你可以创建一个在控制器中加载图像的实用工具方法
public FileContentResult GetImage(int imageId)
{
var image = GetImageById(imageId); // get from a list for example
return File(image, "image/jpeg"); // your image Mime type
}
并在View
中,您可以执行以下操作,迭代图像
@foreach (var image in Model)
{
<img alt="" src="@Url.Action("GetImage", "ControllerName", new {imageId =image.Id})"/>
}
答案 1 :(得分:3)
如果您可以访问图像的MIME类型,则可以始终将它们渲染为Base64编码的图像,而不是向另一个控制器方法发出另一个请求。这是我使用的视图模型:
public class ImageViewModel
{
public string FileName { get; set; }
public string MIME { get; set; }
public byte[] Data { get; set; }
public override string ToString()
{
return string.Format(@"data:{0};base64,{1}", MIME.ToLower(), Convert.ToBase64String(Data));
}
}
您可以使用Filename
标记的alt
属性中的<img />
属性,以便标记&amp;视图中的模型绑定看起来像这样(假设Razor语法):
<img src="@model.ToString()" alt="@model.FileName" />
你确实失去了图像缓存,AFAIK--对我来说这不是一个问题,但对某些人来说这是一个可以理解的交易障碍。
答案 2 :(得分:2)
这应该有效。注意我正在从磁盘读取我的图像,但它们可以来自内存或任何地方。然后在客户端使用java-script显示它们。
[HttpGet]
public JsonResult Images()
{
var image1Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/1.jpg")));
var image2Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/2.jpg")));
var jsonResult = Json(new { image1 = image1Base64, image2 = image2Base64 }, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
return jsonResult;
}
答案 3 :(得分:1)
您希望根据用户的输入显示多个图像,但不想保存到硬盘(聊天)。因此,我建议您使用会话变量来保存用户输入。并使用简单的FileResult
基于该会话变量返回多个图像。
http://blog.theobjectguy.com/2009/12/session-with-style.html
答案 4 :(得分:0)
如果您的要求是在一个视图中显示多个图像,则使用两种操作方法会更容易。一个使用FileResult返回图像,另一个使用标准html img标记指向第一个操作方法