我在我的页面上显示图像,如此
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" />
我的模特
public byte[] PhotoDisplay { get; set; }
然而,PhotoDisplay可能没有图像,因此可能会返回null,因此我会收到错误
mscorlib.dll中出现“System.ArgumentNullException”类型的异常,但未在用户代码中处理
附加信息:值不能为空。“
如何以最好的方式处理这个问题,例如很棒。
答案 0 :(得分:1)
您可以使用共享模板执行此操作。
您可以使用
之类的东西来注释您的字节数组[UIHint("BytePhoto")]
public byte[] PhotoDisplay { get; set; }
并在BytePhoto.cstml
/Views/Shared/DisplayTemplates/
的新文件
该文件内容应该看起来像这样
@model byte[]
@if (Model != null)
{
<img src="data:image;base64,@System.Convert.ToBase64String(Model)" />
} else {
<b>No image to display</b>
}
然后,您可以使用Razor文件中的@Html.DisplayFor(model => model.PhotoDisplay)
而不是<img src="data:image; base64, @System.Convert.ToBase64String(Model.PhotoDisplay)" />
来调用此显示模板。
如果这可能会做很多事情,你可以更进一步,创建一个类,它将封装称为BytePhoto
之类的字节数组。那么您根本不需要UIHint,Razor标记只能使用显示模板。
答案 1 :(得分:0)
我想把nullable可能对你有所帮助,如下所示: -
public byte[]? PhotoDisplay { get; set; }
或者你甚至可以编码如下: -
[Column(TypeName = "image")]
public byte[] PhotoDisplay { get; set; }
答案 2 :(得分:0)
谢谢,还有更好的方法来处理控制器端吗?
只有一个选项,如果你从控制器byte[] PhotoDisplay
传递,你必须验证正面的那个字段 - 正如Stephen Muecke在评论中写道:
@if(Model.PhotoDisplay != null)
{
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" />
}
else
{
// some message
}
否则,你也可以在控制器端执行类似的操作:
private byte[] _photoDisplay
public byte[] PhotoDisplay {
get{
return _photoDisplay!=null?_photoDisplay:new byte[1];
}
set
{
_photoDisplay = value;
}
}
答案 3 :(得分:0)
如果您希望尽可能简化标记,可以执行以下操作:
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay ?? new byte[0])" onerror="this.src='';" />
这基本上做的是,如果您的Mode.PhotoDisplay
proeprty为null,它会将空byte
数组传递给System.Convert.ToBase64String
方法。然后该方法将返回一个空字符串。
此时,浏览器将显示某种&#34;破碎的图像&#34;自src
属性不再有效的图标。因为它不再有效,所以将调用onerror
处理程序。我只是将src
属性设置为空字符串。如果您愿意,可以采用不同的方式处理(例如,将src
设置为网址,完全隐藏标记等)。