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='';" />