2010-03-01 4 views
2

J'ai un SQLDataSource qui est lié à un contrôle ListView mais je veux placer des parties de l'enregistrement lié dans l'attribut HTML TITLE. Voici mon fichier codebehind que je veux changer peut alors utiliser Eval pour construire un titre dynamique en fonction du contenu des données:Comment utiliser Eval dans codebehind pour définir Page.Title

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 

Voici le fichier .aspx correspondant:

<%@ 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> 

Répondre

8

Vous pouvez appeler une méthode (Sub) du code de la page derrière en mettant ce qui suit quelque part à l'intérieur du ItemTemplate de votre ListView:

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

Puis dans votre code derrière (désolé il est en C#):

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

Vous pouvez également passer l'élément de données complète, au lieu d'une propriété:

<%# SetPageTitle(Container.DataItem) %> 

Mise à jour (pour répondre à votre commentaire):

<%# ... %> est une sorte -appelée expression de liaison de données. Il fonctionne uniquement à l'intérieur d'un contrôle lié aux données (ListView dans votre exemple) et fonctionne toujours avec l'enregistrement en cours (généralement, vous affichez plus d'un enregistrement dans un contrôle lié aux données tel que ListView). Lorsque vous utilisez <%# Eval("Price") %>, vous affichez la valeur de la colonne "Prix" de l'enregistrement en cours. Si votre requête renvoyait plus d'un enregistrement, elle serait exécutée pour chaque enregistrement et, lors de la définition du titre de la page (comme indiqué ci-dessus), le titre de la page serait la valeur du dernier enregistrement. D'autre part, <%= ... %>, est juste un extrait de code côté serveur normal (ne sait pas s'il y a un nom spécifique), qui ne connaît pas le contexte de liaison de données (par exemple, qui est le courant record).

S'il vous plaît voir la question suivante pour plus de détails: When should I use # and = in ASP.NET controls?

+1

Merci beaucoup. J'ai cherché beaucoup et n'ai jamais trouvé une bonne explication de pourquoi cette syntaxe: <% # SetPageTitle (Eval ("SomeProperty"))%> par rapport à cette syntaxe: <% SetPageTitle (Eval ("SomeProperty")) %> Venant d'un arrière-plan ASP classique, la deuxième forme semblerait OK. Est-ce que la présence du # (est ce qu'on appelle le symbole de liaison?) Est nécessaire parce que l'instruction contient Eval? –

+0

@John: J'ai essayé d'expliquer la différence dans la réponse mise à jour. – M4N

+2

Quelle belle explication! Je vous remercie. –

Questions connexes