当我的目标是在视图中显示此图像时,我应该在模型中使用哪种图像?

时间:2013-02-02 20:31:39

标签: asp.net-mvc entity-framework razor

我正处于将图像作为字节数组存储在SQL数据库中的情况。我正在使用EF,因此我的模型中有一个字节数组自动属性,然后通过代码首先将其提交到数据库。

我想将一个只读属性(一个Image)放入我的模型中,并在调用get访问器时将字节数组转换为Image。两个问题:

  1. 我应该使用什么样的图像?它应该是System.Drawing图像,还是较新的BitmapImage?
  2. 这会导致代码优先和EF的任何问题吗?
  3. 如果您愿意,我可以发布代码,但我认为没有必要,如果有人想查看我的代码,只需发表评论。

1 个答案:

答案 0 :(得分:2)

  

1)我应该使用什么样的图像?应该是System.Drawing   图像,还是较新的BitmapImage?

他们都不是。您应该使用字节数组(byte[])。

  

2)这会导致代码优先和EF的问题吗?

我不这么认为。我不是EF的专家,但我认为应该可以将byte[]属性映射到数据库中相应的varbinary(max)列。

现在回到您关于在视图模型上显示图像和属性的原始问题。即使您这样做,也不能将此字节数组属性显示为视图中的图像,除非您使用并非所有浏览器都广泛支持的data uri scheme。如果您决定走这条路线,这可能是这样的:

@model MyViewModel
...
<img src="data:image/png;base64,@Html.Raw(Convert.ToBase64String(Model.Image))" alt="some image">

但是,如果您正在寻找一种适用于所有浏览器的解决方案,您可以设计一个控制器操作,将数据库中的图像作为字节数组提取,然后将其传输到响应中。接下来,您可以在<img>代码中引用此操作。

我们举一个例子:

public ActionResult Image(int id)
{
    byte[] imageData = ... go query your database to retrieve the corresponding
                           image record using the id
    return File(imageData, "image/png");
}

然后在主视图中只需将<img>标记指向此控制器操作:

@model MyViewModel
...
<img src="@Url.Action("Image", "SomeController", new { id = Model.Id })">