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 })">