C# ASP.NETMVC4显示图像
我在我的页面上显示了一个这样的图像C# ASP.NETMVC4显示图像,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我在我的页面上显示了一个这样的图像 <img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" /> 但是,PhotoDisplay可能没有图像,因此可能返回null,因此我收到一个错误 mscorlib.dll中发生“System.ArgumentNullException”类型的异常,但未在用户代码中处理 其他信息:值不能为null。“ 如何处理这个问题,最好的方法是,举个例子
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" />
但是,PhotoDisplay可能没有图像,因此可能返回null,因此我收到一个错误
mscorlib.dll中发生“System.ArgumentNullException”类型的异常,但未在用户代码中处理
其他信息:值不能为null。“
如何处理这个问题,最好的方法是,举个例子。我想设置nullable可能会对您有所帮助,如下所示:-
public byte[]? PhotoDisplay { get; set; }
或者您甚至可以按以下方式编写代码:-
[Column(TypeName = "image")]
public byte[] PhotoDisplay { get; set; }
谢谢,有更好的方法来处理它吗 只有一个选项,如果您从控制器
byte[]PhotoDisplay
传递,您必须验证前端的字段-正如Stephen Muecke在评论中所写:
@if(Model.PhotoDisplay != null)
{
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" />
}
else
{
// some message
}
您可以使用共享模板来执行此操作 您可以使用以下内容注释字节数组
[UIHint("BytePhoto")]
public byte[] PhotoDisplay { get; set; }
并在/Views/Shared/DisplayTemplates/
文件内容应该是这样的
@model byte[]
@if (Model != null)
{
<img src="data:image;base64,@System.Convert.ToBase64String(Model)" />
} else {
<b>No image to display</b>
}
@model byte[]
@如果(型号!=null)
{
}否则{
没有要显示的图像
}
然后,您可以在Razor文件中使用@Html.DisplayFor(model=>model.PhotoDisplay)
而不是
调用此显示模板
如果这是您可能需要做的很多事情,您可以更进一步,创建一个类来封装字节数组,称为类似于
BytePhoto
。那么您根本不需要UIHint,Razor标记只需使用显示模板即可工作。如果您希望保持标记尽可能简单le,你可以这样做:
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay ?? new byte[0])" onerror="this.src='';" />
实际上,如果您的Mode.PhotoDisplay
proeprity为空,它将以一个空的字节
数组传递给System.Convert.ToBase64String
方法。然后该方法将返回一个空字符串
此时,浏览器将显示某种类型的“断开图像”图标,因为
src
属性将不再有效。因为它不再有效,将调用onerror
处理程序。我只是将src
属性设置为空字符串。如果您愿意,可以对其进行不同的处理(例如,将src
设置为URL,完全隐藏标记等)。@if(Model.PhotoDisplay!=null){谢谢,有没有更好的方法来处理它控制器端?“控制器端”您所能做的就是添加一个“默认值”“如果PhotoDisplay
为null
则为空图像,这只是一个随机想法:创建1x1透明图像,并在服务器端检查PhotoDisplay
是否有任何值。如果没有,只需返回透明像素(即它的base64值)。Model.PhotoDisplay=Model.PhptoDisplay→System.IO.File.ReadAllBytes”(emptyImagePath)
是否可以?
@model byte[]
@if (Model != null)
{
<img src="data:image;base64,@System.Convert.ToBase64String(Model)" />
} else {
<b>No image to display</b>
}
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay ?? new byte[0])" onerror="this.src='';" />