ASP.net MVC 4显示图像

时间:2015-02-04 09:16:10

标签: c# asp.net-mvc asp.net-mvc-4

我在我的页面上显示图像,如此

 <img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)" />

我的模特

 public byte[] PhotoDisplay { get; set; }

然而,PhotoDisplay可能没有图像,因此可能会返回null,因此我会收到错误

  

mscorlib.dll中出现“System.ArgumentNullException”类型的异常,但未在用户代码中处理

附加信息:值不能为空。“

如何以最好的方式处理这个问题,例如很棒。

4 个答案:

答案 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设置为网址,完全隐藏标记等)。