سؤال

لديّ sqldatasource مرتبط بعنصر تحكم في ListView ولكني أريد وضع أجزاء من السجل المربوطة في سمة عنوان HTML. فيما يلي ملف 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>
هل كانت مفيدة؟

المحلول

يمكنك استدعاء طريقة (فرعية) من رمز الصفحة خلفها عن طريق وضع ما يلي في مكان ما داخل itemtemplate من عرض القائمة الخاص بك:

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

ثم في الكود الخاص بك وراء (آسف إنه في C#):

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

بدلاً من ذلك ، يمكنك أيضًا تمرير عنصر البيانات الكامل ، بدلاً من خاصية واحدة فقط:

<%# SetPageTitle(Container.DataItem) %> 

تحديث (للإجابة على تعليقك):

<%# ... %> هو ما يسمى التعبير ربط البيانات. إنه يعمل فقط داخل عنصر تحكم مرتبط بالبيانات (عرض القائمة في مثالك) ويعمل دائمًا مع السجل الحالي (عادةً ما تقوم بعرض أكثر من سجل في عنصر تحكم مرتبط بالبيانات مثل ListView).

لذلك عندما تستخدم <%# Eval("Price") %>, ، أنت تعرض قيمة عمود "السعر" للسجل الحالي. إذا كان استعلامك ، سيعود أكثر من سجل واحد ، فسيتم تنفيذ ذلك لكل سجل ، وعند تعيين عنوان الصفحة (كما هو موضح أعلاه) ، سيكون عنوان الصفحة هو القيمة من السجل الأخير.

على الجانب الآخر <%= ... %>, ، هو مجرد مقتطف رمز من جانب الخادم العادي (لا أعرف ما إذا كان هناك اسم محدد لذلك) ، والذي لا يعرف سياق ربط البيانات (على سبيل المثال وهو السجل الحالي).

يرجى الاطلاع على السؤال التالي لمزيد من التفاصيل: متى يجب أن أستخدم # و = في عناصر التحكم ASP.NET؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top