3

当我尝试使用以下方法在详细信息页面模板中显示 byte[] 数组图像时:

public FileContentResult RenderPhoto(byte[] photo)
{
    // var array = (byte[])Session["photo"];
    // return File(array, "image/jpeg");

    return File(photo, "image/jpeg");
}

<img src="@Url.Action("RenderPhoto", Model.Photo)"/>

照片为空。

如果我将 student.Photo 存储在 Session 中:

//
// GET: /Student/Details/5

public ViewResult Details(int id)
{
    Student student = db.Students.Find(id);

    Session["photo"] = student.Photo;

    return View(student);
}

并尝试显示从 Session 检索值的图像(上面的注释行)它可以工作。

为什么在第一种情况下我得到一个空值?

将 student 传递给 View in 后ViewResult Details(int id)Model.Photo不再持有该值吗?

4

2 回答 2

11

为什么在第一种情况下我得到一个空值?

您不能在<img>标签中将字节数组传递给服务器。<img>标签只是向指定的资源发送一个 GET 请求。正确的方法是使用 id:

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

进而:

public ActionResult RenderPhoto(int photoId)
{
    byte[] photo = FetchPhotoFromDb(photoId);
    return File(photo, "image/jpeg");
}
于 2011-04-21T05:57:30.810 回答
1

首先

Url.Action("RenderPhoto", Model.Photo)

不起作用,Model.Photo(大概是你的字节数组)将被视为一个对象来推断路由值。它将生成一个具有 Array 对象的公共属性的路由,可能类似于

?IsFixedSize=true&IsReadOnly=false&Length=255

这将是一个非常无用的网址。一旦页面在浏览器中加载,浏览器将请求该图像,调用您的 RenderPhoto 方法,但没有名为 photo 的参数,因此绑定会失败,即使那里有一个名为 photo 的参数(AFAIK),在DefaultModelBinder 用于从字符串创建字节数组,因此 photo 为空。

您需要做的是将具有 Id 属性的匿名对象传递给 Url.Action

Url.Action("RenderPhoto", new { Id = Model.PhotoId })

这可能会按照以下方式转换为查询字符串(但这取决于您的路线)

/xxx/RenderPhoto/25

然后您需要在 RenderPhoto 方法中检索照片的数据

马丁

于 2011-04-21T06:14:44.860 回答