невозможно отобразить изображение из базы данных в списке - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь отобразить аватар пользователя, который написал комментарий. Я использую 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 ]

4 голосов
/ 08 августа 2011

Предполагая, что ваши изображения, указанные в столбце 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>
3 голосов
/ 08 августа 2011

Этот тег определенно не будет делать то, что вы думаете:

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

Вы используете нотацию относительного пути на стороне сервера с символом ~, что ничего не значит на стороне клиента. Браузер не будет знать, где находится этот файл.

Быстрый способ решить эту проблему - добавить runat="server" к тегу, который укажет движку ASP.NET, что тег должен быть обработан перед отображением его клиенту. Это приведет к тому, что пути на стороне сервера будут преобразованы в значимые пути на стороне клиента (во всяком случае, насколько это возможно, в любом случае, что может в этом случае). Другой вариант - использовать относительный путь к странице, например ../images/user_images/ (или любой другой путь).

Что касается того, почему тег <asp:Image> не работает, можете ли вы показать визуализированный вывод HTML этого тега? Если изображение не отображается в веб-браузере, это может быть по ряду причин. Тег может не отображаться так, как вы думаете. Или изображение может быть недоступно из Интернета. Или путь может быть неправильным. И т.д.

Редактировать: Исходя из вашего комментария к вопросу выше, ваш тег <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 в оставшуюся часть строки.

...