Pergunta

Eu tenho um sqldatasource que está vinculado a um controle da ListView, mas quero colocar partes do registro vinculado no atributo de título HTML. Aqui está o meu arquivo codeBehind que eu quero alterar para que ele possa usar o aval para construir um título dinâmico com base no conteúdo dos dados:

Public Partial Class zShowAd
Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Page.Title = " Dynamically set in ASPX page" 
        'how to use Eval here instead of the above constant ??    
    End Sub
End Class

Aqui está o arquivo .aspx correspondente:

<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/zSEO.master" 
  CodeBehind="zShowAd.aspx.vb" Inherits="Zipeee.zShowAd" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div>
  <asp:ListView ID="ShowAd" runat="server" DataSourceID="aPosting">
    <LayoutTemplate>
      <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
    </LayoutTemplate>
   <ItemTemplate>
   <div>
    <div id="wrapper"> 
        <div id="header"></div> 
        <div id="main"> 
            <div id="nav">    AdID: <%#Eval("AdID")%></div> 
            <div id="extras">Price: <%#Eval("Price")%></div> 
            <div id="content">      <%#Eval("AdDesc")%></div> 
        </div> 
        <div id="footer"></div> 
    </div>
   </div>
  </ItemTemplate>
 </asp:ListView>

 <asp:sqldatasource runat="server" id="aPosting"
        ConnectionString="<%$ ConnectionStrings:ZIPeeeConnectionString2 %>" 
        SelectCommand="spGetAdByID" SelectCommandType="StoredProcedure">
        <SelectParameters>
            <asp:QueryStringParameter Name="AdId" QueryStringField="a" Type="String" />
        </SelectParameters>
    </asp:sqldatasource>
</div>
</asp:Content>
Foi útil?

Solução

Você pode chamar um método (sub) do código da página por trás, colocando o seguinte em algum lugar dentro do itemTemplate do seu ListView:

<%# SetPageTitle(Eval("SomeProperty")) %> 

Então, em seu código atrás (desculpe, está em C#):

protected void SetPageTitle(object title)
{
  this.Title = title.ToString();
}

Como alternativa, você também pode passar no item de dados completo, em vez de apenas uma propriedade:

<%# SetPageTitle(Container.DataItem) %> 

Atualização (para responder ao seu comentário):

<%# ... %> é a chamada expressão de ligação a dados. Ele funciona apenas dentro de um controle ligado a dados (o ListView no seu exemplo) e sempre funciona com o registro atual (normalmente você exibe mais de um registro em um controle ligado a dados como o ListView).

Então, quando você usa <%# Eval("Price") %>, você está exibindo o valor da coluna "Price" do registro atual. Se a sua consulta retornaria mais de um registro, isso seria executado para cada registro e, ao definir o título da página (como mostrado acima), o título da página seria o valor do último registro.

Por outro lado <%= ... %>, é apenas um trecho de código do lado do servidor normal (não sei se existe um nome específico para ele), que não sabe sobre o contexto de ligação a dados (por exemplo, que é o registro atual).

Por favor, veja a seguinte pergunta para obter mais detalhes: Quando devo usar o # e = nos controles do ASP.NET?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top