Domanda

Ho uno SQLDataSource che è associato a un controllo ListView ma voglio luogo parti del record legati in attributo HTML TITLE. Ecco il mio file codebehind che voglio cambiare in modo che possa usare Eval per costruire una dinamica TITOLO in base al contenuto dei dati:

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

Questo è il file aspx corrispondente:

<%@ 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>
È stato utile?

Soluzione

È possibile chiamare un metodo (Sub) del codice della pagina dietro mettendo seguente da qualche parte all'interno del ItemTemplate del vostro ListView:

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

Poi, nel tuo codice dietro (mi dispiace che sia in C #):

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

In alternativa, si può anche passare il dato completo, invece di una proprietà:

<%# SetPageTitle(Container.DataItem) %> 

Update (per rispondere a un commento):

<%# ... %> è un cosiddetto un'espressione di associazione dati. Funziona solo all'interno di un controllo con associazione a dati (ListView nel tuo esempio) e funziona sempre con il record corrente (in genere di visualizzare più di un record in un controllo con associazione a dati come il ListView).

Quindi, quando si utilizza <%# Eval("Price") %>, si sta visualizzando il valore della colonna "prezzo" del record corrente. Se la tua ricerca, sarebbe tornato più di un record, allora questo sarebbe stato giustiziato per ogni record, e quando si imposta il titolo della pagina (come mostrato sopra), il titolo della pagina sarebbe il valore dell'ultimo record.

D'altra <%= ... %> parte, è solo un normale frammento di codice lato server (non so se c'è un nome specifico per esso), che non conosce il contesto di associazione dati (ad esempio, che è il record corrente ).

Si prega di consultare la seguente questione per ulteriori dettagli: Quando dovrebbe io uso # e = a controlli ASP.NET?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top