Как использовать Eval в codebehind для установки Page.Title - PullRequest
2 голосов
/ 02 марта 2010

У меня есть SQLDataSource, который связан с элементом управления ListView, но я хочу поместить части связанной записи в атрибут HTML TITLE. Вот мой файл codebehind, который я хочу изменить, чтобы он мог использовать Eval для создания динамического заголовка на основе содержимого данных:

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

Вот соответствующий файл .aspx:

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

1 Ответ

8 голосов
/ 02 марта 2010

Вы можете вызвать метод (Sub) кода страницы, поместив следующее где-то внутри ItemTemplate вашего ListView:

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

Затем в вашем коде позади (извините, это на C #):

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

Кроме того, вы также можете передать полный элемент данных вместо одного свойства:

<%# SetPageTitle(Container.DataItem) %> 

Обновление (для ответа на ваш комментарий):

<%# ... %> - это так называемое выражение для привязки данных.Он работает только внутри элемента управления с привязкой к данным (ListView в вашем примере) и всегда работает с текущей записью (обычно вы отображаете более одной записи в элементе управления с привязкой к данным, например ListView).

Поэтому, когда вы используете <%# Eval("Price") %>, вы отображаете значение в столбце «Цена» текущей записи.Если ваш запрос вернет более одной записи, то он будет выполнен для каждой записи, а при установке заголовка страницы (как показано выше) заголовок страницы будет значением из последней записи.

С другой стороны, <%= ... %>, это просто обычный фрагмент кода на стороне сервера (не знаю, существует ли для него конкретное имя), который не знает о контексте привязки данных (например, который является текущей записью).

Для получения более подробной информации см. Следующий вопрос: Когда мне следует использовать # и = в элементах управления ASP.NET?

...