C# System.DBnull时如何不求值?

C# System.DBnull时如何不求值?,c#,asp.net,C#,Asp.net,我有一个gridview,只在其中一些上推spareparts宽度图像。 在我的gridview中,我有这个itemtemplate <asp:TemplateField HeaderText="Image"> <ItemTemplate> <asp:Image ID="Image1" Height="100px" Width="100px" ImageUrl='<%# "data:Image/png;base64,"+ Convert.ToBase64

我有一个gridview,只在其中一些上推spareparts宽度图像。 在我的gridview中,我有这个itemtemplate

<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<asp:Image ID="Image1" Height="100px" Width="100px"  ImageUrl='<%#  
"data:Image/png;base64,"+ Convert.ToBase64String((byte[])Eval("Img")) %>' 
runat="server" />                                                           
</ItemTemplate>
</asp:TemplateField>

当数据库中没有图像时,这会给我一个错误“System.dbnull”。我已经尝试了很多方法,但我不想在这里发布它们。它们不起作用。我不喜欢在每行中插入默认图像的想法。而且我只希望大小是必要的。我如何解决这个问题?

您可以使用
Eval(“图像”))是否为DBNull
,以判断要输出的内容 我没有长时间使用webform,但应该可以工作

<asp:TemplateField HeaderText="Image">
<ItemTemplate>


    <asp:Image 
Visible='<%#Eval("Img")!=DBNull.Value%>' // hide the image if no data 
ID="Image1" Height="100px" Width="100px"  
ImageUrl='<%#Eval("Img")!=DBNull.Value ? "data:Image/png;base64,"+ Convert.ToBase64String((byte[])Eval("Img")) : string.Empty %>' 
    runat="server" />  

</ItemTemplate>
</asp:TemplateField>

看起来您正在渲染大小为几千字节的图像。如果是这样,则不应将图像渲染为base64编码字符串

主要原因是浏览器无法缓存图像,如果图像作为base64编码字符串嵌入到页面中。因此,每次用户查看相同的图像时,浏览器都必须重新加载每个图像以及页面内容

理想情况下,您应该使用图像处理程序来呈现这些图像。一开始似乎很多,但相信我,这将大大提高后续页面加载的速度

比如说,


公共类ImageHandler:IHttpHandler
{
公共void ProcessRequest(HttpContext上下文)
{
var id=context.Request.QueryString[“id”];
//根据id从数据库中以字节数组的形式检索图像数据
context.Response.BinaryWrite(YourImageByte);
}
公共布尔可重用{get{return false;}}
}

@Ray H的解决方案最终对我有效,但由于我们的代码是用VB编写的,而不是用C#编写的,因此需要不同的标记!为了帮助他人,下面是我对Ray的解决方案的转换,适用于VB用户-这有点冗长:

               <asp:TemplateField HeaderText="Image" >
                        <ItemTemplate>
                            <asp:Image ID="Image2" runat="server" Width="100px" Height="42px" ImageUrl='<%#If(Eval("Image") IsNot DBNull.Value, "data:Image/png;base64," + Convert.ToBase64String(Eval("Image")), String.Empty)  %>' />
                        </ItemTemplate>
                        <ItemStyle Font-Names="9px" HorizontalAlign="Left" />
                    </asp:TemplateField>

关键部分如下:

ImageUrl='<%#If(Eval("Image") IsNot DBNull.Value, "data:Image/png;base64," + Convert.ToBase64String(Eval("Image")), String.Empty)  %>' />
ImageUrl=''/>

Eval(“Image”)!=DBNull.Value
@ASpirin哈哈,我很傻,是的,同样的,但你的更好这给了我另一个错误。“Eval()、XPath()和Bind()等数据绑定方法只能在上下文中使用。。。“@TheneOne上次使用webform已经有很长时间了,请检查我更新的代码,它应该可以工作VS2017不喜欢(byte[])强制转换(它不断地逐字节更改,但随后也不喜欢!显示的错误是:“'byte'是一种结构类型,不能用作表达式”)。它也不喜欢添加“:string.Empty”(“表达式不是方法”)的建议解决方案,如上所示:(我们的代码隐藏使用VB.NET,这可能是相关的。理想情况下,我们不应该渲染base64编码的图像,除非它是一个非常小的图像。否则,页面大小将非常大,浏览器无法缓存图像。改为使用什么?
ImageUrl='<%#If(Eval("Image") IsNot DBNull.Value, "data:Image/png;base64," + Convert.ToBase64String(Eval("Image")), String.Empty)  %>' />