如何在System.DBnull时不进行评估?

时间:2017-09-23 12:46:22

标签: c# asp.net

我只有一些网格视图推送备件宽度图像。 在我的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>

当数据库中没有图像时,这会给我一个错误&#34; System.dbnull。我尝试了很多东西,但我没有&#39;想在这里发帖。他们没有&#39;我不喜欢将默认图像插入每一行的想法。我也希望这个尺寸只是必要的。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您可以使用Eval(“Image”) is 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>

答案 1 :(得分:0)

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

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

理想情况下,您应该使用图像处理程序来渲染这些图像。一开始似乎很多,但相信我它会大大证明后续页面加载的速度。

例如,

<asp:TemplateField HeaderText="Image">
    <ItemTemplate>
        <asp:Image ID="Image1" 
            ImageUrl='<%# "~/ImageHandler.ashx?id=" + Eval("Id") %>'
            runat="server" />                                                           
    </ItemTemplate>
</asp:TemplateField>

public class ImageHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        var id = context.Request.QueryString["id"];    
        // Retrieve the image data as byte array from database based on the id    
        context.Response.BinaryWrite(YourImageByte);
    }

    public bool IsReusable { get{ return false; }}
}

答案 2 :(得分:0)

@Ray H的解决方案最终为我工作,但是,由于我们的后台代码在VB中而不是C#中,因此需要不同的标记!希望对其他人有所帮助,这是我为VB用户设计的Ray解决方案的转换-有点冗长:

               <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)  %>' />