2

我有一个问题想发表一些意见。我完全明白我不能直接从我的视图模型渲染图像(字节 [])。我知道我需要一个 id 来代表我的视图模型中的图像。

一旦我将我的视图模型绑定到我的视图,我就可以执行以下操作:

<img src="@Url.Action("GetPhoto", new { photoId = Model.PhotoId })" />

然后这个:

public ActionResult GetPhoto(int photoId)
{
    byte[] photo = GetPhotoFromDb(photoId);
    return File(photo, "image/jpeg"); 
}

但是,我调用了第 3 方 Web 服务(我不控制它),我调用它来获取填充我的视图模型的聚合。像这样的一些事情:

-Vehicle
  -VehicleId
  -VehicleName
  -VehicleImage byte[] <=======
  -VehicleServiceHistory
    -ServiceHistoryId
    -SericeType
    -ServiceTitle

所以理论上我可以打电话给第 3 方网络服务人员说,我知道你已经给了我的 VehicleImage 汇总(上图),但我可以单独调用一个名为 GetImageById(int imageId) 的新服务方法吗.

所以让我们假设他们说不。所以我所拥有的只是已经拥有我的图像的数据聚合,但我知道我必须像上面所说的那样将图像单独加载到视图中:

<img src="@Url.Action("GetPhoto", new { photoId = Model.PhotoId })" />

我可以做一些讨厌的事情,比如当聚合从 Web 服务下来时将图像添加到会话中并询问会话以使用 photoId 获取图像, 但我没有办法这样做。

任何人都可以给我任何想法,让我了解如何使用已经可用的图像,而无需再打另一个电话。

注意:我完全可以调用单独的操作:

public ActionResult GetPhoto(int photoId)
{
    byte[] photo = GetPhotoFromDb(photoId);
    return File(photo, "image/jpeg"); 
}

但我想在此操作中使用已在聚合中提供的图像,而不必再次调用该服务。

期待听到您的建议。

谢谢RuSs

注意:这篇文章已经在这里发布了几个星期,肯定有人有意见!!:(

4

2 回答 2

2

我完全明白我不能直接从我的视图模型渲染图像(字节 [])

实际上,如果浏览器支持data URI scheme

<img src="data:image/jpeg;base64,@Html.Raw(Convert.ToBase64String(Model.VehicleImage))" />

除此之外没有太多选择。您必须在 2 个 HTTP 调用之间将图像保存在服务器上的某个位置。我祝贺你不希望为此使用 Session。这不是正确的存储方式。一种可能性是将图像保存在服务器上的某个文件夹(如果您在网络农场上运行,则为共享文件夹),然后仅通过 id 引用图像。所以基本上你将在你的基础设施上缓存远程图像。您可能有一些计划的脚本正在删除早于您可以定义的某个日期的文件。

于 2013-02-21T22:01:49.493 回答
0

答案是您必须填充包含您要渲染的图像的 id 的视图模型。

一旦 viewmodel 被渲染,你必须像这样调用另一个控制器动作:

public ActionResult GetPhoto(int photoId()
{
    byte[] photo = GetPhotoFromDb(photoId);
    return File(photo, "image/jpeg"); 
}

经过大量调查,除非所有浏览器都支持数据 URI 方案,否则似乎就是这样。

<img src="data:image/jpeg;base64,@Html.Raw(Convert.ToBase64String(Model.VehicleImage))" />

希望这可以帮助。

于 2013-04-29T06:34:00.693 回答