无法在listview中显示数据库中的图像

时间:2011-08-07 23:12:37

标签: asp.net listview webforms sqldatasource

我正在尝试显示撰写评论的用户的头像。我正在使用listview来显示“评论,日期,用户名和imageAvatar”,但无法弄清楚是什么问题..

<asp:Image ID="DisplayAvatarShout" 
    runat="server" 
    AlternateText='<%# Eval ("UserName") %>' 
    ImageUrl='~/images/user_images/<%# Eval ("Avatar") %>' 
    width="20px" />

<img src='~/images/user_images/<%# Eval ("Avatar") %>' 
    width="20px" 
    alt='<%# Eval ("UserName") %>' />

这是Sql连接,可能有问题

 SelectCommand="SELECT aspnet_Users.UserName, Custon_Shouts.Body_shout, Custon_Shouts.Date_shout, Custon_UserInfo.Avatar FROM aspnet_Users INNER JOIN Custon_Shouts ON aspnet_Users.UserId = Custon_Shouts.UserId INNER JOIN Custon_UserInfo ON aspnet_Users.UserId = Custon_UserInfo.UserId ORDER BY Custon_Shouts.Date_shout DESC">
</asp:SqlDataSource>

呈现HTML <img id="ContentPlaceHolder1_ListView3_DisplayAvatarShout_1" src="images/user_images/%3C%25#%20Eval%20(%22Avatar%22)%20%25%3E" alt="rokky" style="width:20px;" /> <img src='~/images/user_images/022.jpg' width="20px" alt='rokky' />

2 个答案:

答案 0 :(得分:4)

假设Avatar列中指定的图像实际存在于服务器上的路径中,并且在SqlDataSource中有一个包含有效数据的结果集,那么您应该能够写:

<asp:ListView ID="foo" runat="server"  DataSourceID="MySqlDataSource" >
   <ItemTemplate>
        <asp:Image ID="DisplayAvatarShout"  runat="server" 
                   ImageUrl='<%# Eval("Avatar", "~/images/user_images/{0}")%>'/>
   </ItemTemplate>
</asp:ListView>

<asp:SqlDataSource ID="MySqlDataSource">
<SelectCommand="your SQL statement">
</asp:SqlDataSource>

答案 1 :(得分:3)

这个标签肯定不会按照你的想法做到:

<img src='~/images/user_images/<%# Eval ("Avatar") %>' 
width="20px" 
alt='<%# Eval ("UserName") %>' />

您正在使用带有~字符的服务器端相对路径表示法,这意味着没有客户端。浏览器不知道该文件的位置。

解决这个问题的一种快速方法是将runat="server"添加到标记中,这将向ASP.NET引擎指示在将标记显示到客户端之前需要处理标记。这将导致服务器端路径被转换为有意义的客户端路径(无论如何,它最好,在这种情况下它可以)。另一种选择是使用页面的相对路径,例如../images/user_images/(或任何路径)。

至于<asp:Image>标记无效的原因,您能否显示该标记的呈现HTML输出?如果图像未在Web浏览器中显示,则可能由于多种原因。标签可能不会像您认为的那样呈现。或者可能无法从网络访问图像。或者路径可能是错误的。等

修改:根据您对上述问题的评论,您的<asp:Image>代码正在呈现为:

<img id="ContentPlaceHolder1_ListView3_DisplayAvatarShout_1"
     src="images/user_images/%3C%25#%20Eval%20(%22Avatar%22)%20%25%3E"
     alt="rokky" style="width:20px;" />

要调试此问题,您最大的线索是Eval适用于Username,但适用于Avatar。问问自己,这两者有什么区别?我看到的唯一区别是其中一个是自己调用而另一个(不工作的)是一个更大的字符串的一部分。

幸运的是,Eval方法有办法处理这个问题。而不是:

ImageUrl='~/images/user_images/<%# Eval("Avatar") %>'

试试这个:

ImageUrl='<%# Eval("Avatar", "~/images/user_images/{0}") %>'

这是一种将Avatar值注入字符串其余部分的更简洁方法。