Как использовать Eval в коде программной части для установки Page.Title
-
23-09-2019 - |
Вопрос
У меня есть SQLDataSource, привязанный к элементу управления ListView, но я хочу поместить части связанной записи в атрибут HTML TITLE.Вот мой файл кода программной части, который я хочу изменить, чтобы он мог использовать Eval для создания динамического 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
Вот соответствующий файл .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>
Решение
Вы можете вызвать метод (Sub) кода страницы, поместив следующее где-нибудь внутри ItemTemplate вашего ListView:
<%# SetPageTitle(Eval("SomeProperty")) %>
Затем в вашем коде (извините, он на С#):
protected void SetPageTitle(object title)
{
this.Title = title.ToString();
}
Альтернативно вы также можете передать весь элемент данных вместо одного свойства:
<%# SetPageTitle(Container.DataItem) %>
Обновление (чтобы ответить на ваш комментарий):
<%# ... %>
это так называемое выражение привязки данных.Он работает только внутри элемента управления с привязкой к данным (ListView в вашем примере) и всегда работает с текущей записью (обычно вы отображаете более одной записи в элементе управления с привязкой к данным, например ListView).
Поэтому, когда вы используете <%# Eval("Price") %>
, вы отображаете значение столбца «Цена» текущей записи.Если ваш запрос вернет более одной записи, то это будет выполнено для каждой записи, а при установке заголовка страницы (как показано выше) заголовком страницы будет значение из последней записи.
С другой стороны <%= ... %>
, это обычный фрагмент кода на стороне сервера (не знаю, есть ли для него конкретное имя), который не знает о контексте привязки данных (например,это текущий рекорд).
Для получения более подробной информации см. следующий вопрос: Когда следует использовать # и = в элементах управления ASP.NET?