【问题标题】:Display default image or image in bytes in datalist - asp.net在 datalist 中以字节为单位显示默认图像或图像 - asp.net
【发布时间】:2021-12-15 07:15:57
【问题描述】:

我目前从数据库中检索数据并将其存储在数据列表中。其中一项是用于显示图像的字节值。该代码有效,但是,当没有可用的图像时,由于尝试对空值执行操作而遇到错误。如果数据库的 image 字段中没有值,是否有任何方法可以显示默认图像,例如在相关图像下方的 imageButton 中找到的图像?

   <asp:DataList ID="applicationsDataList" runat="server" RepeatColumns="4" OnItemCommand="itemCommand" >   

      <ItemTemplate>  
        
      <table>    
          <tr>
        <td>        
            <asp:ImageButton ID="userImage" CssClass="cardImage" CommandName="profile" runat="server" ImageUrl='<%# "data:image/jpg;base64," + Convert.ToBase64String((byte[])Eval("image")) %>'/>
          <%--<asp:ImageButton CssClass="cardImage" CommandName="profile" runat="server" ImageUrl="/Images/blank.png"/>--%>
        </td>  
        </tr>
 </table>  
        </ItemTemplate>  
  
    </asp:DataList>  

感谢天才!

【问题讨论】:

    标签: c# html asp.net database image


    【解决方案1】:

    您可以使用C#的ternary operator来检查该值是否为null,并为默认图像插入一个base64字符串。

    类似这样的:

    ImageUrl='<%# "data:image/jpg;base64," + Eval("image") != null ? Convert.ToBase64String((byte[])Eval("image")) : Convert.ToBase64String(GetDefaultImage()) %>'
    

    这是假设Eval("image") 正在返回null?如果可能,最好将调用移动到表达式之外的Eval(),这样您就不会调用它两次(一次在条件中,一次在结果中)。然后,您可以定义一个类似GetDefaultImage() 的函数来返回一个带有默认图像的字节数组。

    【讨论】:

    • 嗨,我喜欢你的方法,我意识到的唯一问题是 Eval("image") 没有返回 null,而是返回 DBNull。你知道如何检查吗?它似乎不喜欢我用 DBNull.Value 替换语句中的 null ...
    • 如果你返回一些更容易从你的 Eval() 方法评估的东西,那可能是最好的。但如果这不可能,您可以使用 'Eval("image") is DBNull' 来检查返回值是否为 DBNull 类型。我可以在您自己的答案中看到您将其转换为字符串并检查它是否为空,但是可以通过这个简单的检查来避免这种情况。
    【解决方案2】:

    这是我最后用来解决问题的方法:)

    ImageUrl='<%# !string.IsNullOrEmpty(Eval("image").ToString()) ? "data:image/jpg;base64," + Convert.ToBase64String((byte[])Eval("image")) : "/Images/blank.png" %>' />
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    如前所述,您可以处理更“复杂”的表达式。但话又说回来? 我经常只是在数据绑定事件中编写代码。

    所以,有了这个:

         <asp:ImageButton ID="userImage" CssClass="cardImage" CommandName="profile"
         runat="server"/>
    

    然后将上面的内容放入数据绑定中。就不得不在项目数据绑定中编写几行额外的代码,或者在标记中难以阅读混乱的表达而言,这有点被淘汰了? (我愿意为此掷硬币)。

    但是,绑定的item数据就变成了这样:

        protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item 
                | e.Item.ItemType == ListItemType.AlternatingItem)
            {
                ImageButton btnImg = (ImageButton)e.Item.FindControl("userImage");
                DataRowView rRow = (DataRowView)e.Item.DataItem;
    
                if (DBNull.Value.Equals(rRow["image"]))
                    btnImg.ImageUrl = "~/Content/ckdelete.png";
                else
                    btnImg.ImageUrl = @"data:image/png;base64,"
                        + Convert.ToBase64String((byte[])rRow["image"]);
            }
        }
    

    请注意我们如何能够获取数据绑定行值。该数据集仅在数据绑定事件期间持续存在 - 完成后,它会超出范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2018-05-07
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多