لا يتم تحديث Listview بشكل كامل على databind() بعد إعادة النشر

StackOverflow https://stackoverflow.com/questions/821053

سؤال

لدي عنصر تحكم ListView يُظهر سلوكًا غريبًا - يتم تحديث الصفوف جزئيًا فقط بعد إعادة النشر.آمل أن يتمكن شخص ما هنا من إلقاء بعض الضوء على سبب حدوث ذلك.

يرتبط DataSource الخاص بي بقائمة العناصر المخزنة في حالة جلسة الصفحة.وهذا مقصود، جزئيًا لانتهاء مهلة طرق العرض القديمة نظرًا لأن العديد من المستخدمين يعرضون البيانات.في عملية منتجع عادية، تتم معالجة الفرز على الصفحة عبر جافا سكريبت، ويتم الاحتفاظ بترتيب بيانات القائمة/الجلسة متزامنًا عبر عمليات الاسترجاعات.يتحقق رد الاتصال أيضًا من مستويات الأذونات.في عملية منتجع معينة أكثر تعقيدًا، يقوم جافا سكريبت الموجود على الصفحة بإجراء إعادة نشر للصفحة للتعامل مع منطق الفرز.يتم تحديث القائمة/الجلسة كما هو الحال في رد الاتصال، ثم يتم ارتداد عنصر تحكم عرض القائمة إلى البيانات.يتم تحميل الصفحة مرة أخرى، وتعرض الصفوف الترتيب الجديد.لا مشكلة، أليس كذلك؟

المشكلة هي بعض العناصر الموجودة في عرض القائمة لا تغير قيمتها وفقًا للترتيب الجديد.بينما يتم تحديث الارتباطات التشعبية والنص الذي تتم معالجته على الصفحة (على سبيل المثال <%# Eval("ProjectAbbrev") %>) بشكل مناسب، فإن مربعات الاختيار والأحرف الحرفية والقوائم المنسدلة التي تم تعيين قيمها عبر أسلوب الحدث OnItemDataBound لم يتم تحديثها - فهي تبقى "مجمد" في مكانه، على الرغم من أن التنقل خلال التعليمات البرمجية يكشف أن الطريقة يتم تشغيلها أثناء إعادة النشر، وأنه يجب تعيين عناصر التحكم على قيمها الجديدة.إذا ذهبت واقتطعت القائمة يدويًا لأقول، نصف الحجم الأصلي، فمن المؤكد أنه سيتم إعادة ملء هذه العناصر فقط، لكن مربعات الاختيار وما شابه ذلك لا تزال تحتفظ بقيمها الأصلية.

لذلك سؤالي هو:لماذا لا يتم تحديث هذه العناصر مع بقية عناصر التحكم في عرض القائمة في إعادة النشر؟لدي شعور بأنني إما أسيء فهم دورة حياة الصفحة في ASP.NET أو أنني واجهت خطأ من نوع ما.

في هذه المرحلة، أفكر أنه سيتعين علي نقل عملية الفرز الأكثر تعقيدًا إلى الصفحة في جافا سكريبت، لكن ذلك سيكون أمرًا صعبًا إلى حد ما وأود تجنب القيام بذلك إن أمكن.


تحديث:لقد حاولت ضبط EnableViewState على false ولم يحل هذا الأمر.لم أتمكن من استخدام هذا التكتيك بأي حال من الأحوال لأن الأجزاء الأخرى من الصفحة (حفظ) تعتمد على قراءة حالة العرض في النهاية.
تحديث:أقدم بعض مقتطفات التعليمات البرمجية على أمل أن تلقي بعض الضوء على هذه المشكلة:

صفحة:سيتم تحديث عنصر HyperLink بشكل صحيح بعد إعادة النشر، لكن CheckBox الذي تم تعيين قيمته في أسلوب OnQueueRepeater_ItemDataBound، سيبقى كما هو.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
 <ItemTemplate>
  <tr>
   <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
   <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
  </tr>
 </ItemTemplate>
</asp:ListView>

الكود خلف:عند إعادة النشر، يتم تنفيذ التعليمات البرمجية التالية:

protected List<Book> QueueDataItems
{
 get { return (List<Book>)Session["Queue"]; }
 set { Session["Queue"] = value; }
}

else if (IsPostBack && !Page.IsCallback)
{
 // resort QueueDataItems List appropriately
 ResortQueue(Request.Params) 
 // rebind
 QueueListView.DataSource = QueueDataItems;
 QueueListView.DataBind();
}

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
 // ...
 // ... other controls set
 CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
 scannedCheckBox.Checked = book.Scanned;
}

تحديث:لقد تخليت عن تشغيل هذا وقمت بنقل منطق الفرز الخاص بي إلى جانب العميل باستخدام جافا سكريبت.إذا كان لدى أي شخص أي أفكار حول سبب حدوث هذا السلوك الغريب، فسأظل مهتمًا جدًا بسماعها!

هل كانت مفيدة؟

المحلول

من باب الاهتمام، ما هي النقطة في الصفحة التي تقوم بربط البيانات عليها؟تحميل الصفحة؟

جربه على OnPreRender - قد يساعدك.

نصائح أخرى

يبدو أن ViewState يبدأ في إعادة ملء البيانات.على أي حال، إذا كنت تقوم بربط البيانات في كل إعادة نشر على أي حال، فمن المحتمل أن تقوم بتعيين EnableViewState الخاص بـ ListView الخاص بك على false لتقليل حجم الصفحة.

أعتقد أن هذا مرتبط بالترتيب الذي يتم فيه تشغيل الأحداث المختلفة أثناء دورة حياة الصفحة.يرى نظرة عامة على دورة حياة صفحة ASP.NET.يجب عليك إجراء ربط البيانات في Page_OnPreRender للتأكد من أن إعادة النشر تتم بعد أحداث التحكم (التي ستتسبب في تحديث البيانات) على الصفحة.

ربما يتم إعادة ربط QueueListView الخاص بك لسبب ما.

حاول إعادة تعيين قيمة DataSource بعد DataBind() لمعرفة ما سيحدث

QueueListView.DataBind();
QueueListView.DataSource = null;

هل هناك أي فرصة لأن تكون هذه مشكلة في التخزين المؤقت؟لقد واجهت مشكلة مماثلة باستخدام طريقة عرض القائمة مع XMLDatasource.حاولت إيقاف تشغيل كل حالة العرض.سأقوم بربط عرض القائمة في الكود الموجود خلفه واستخدام XPath لكتابة كل شيء على الشاشة في صفحة aspx الخاصة بي.تم استخدام هذا في البحث.... وفي المرة التالية التي أجريت فيها عملية بحث، لم تظهر أي من المعلومات الجديدة.والسبب هو أن XMLDatasource قد تم تمكين التخزين المؤقت فيه بشكل افتراضي.في حالتي كنت أضغط على قاعدة البيانات في كل مرة ولم أكن بحاجة إلى تخزينها مؤقتًا.لقد قمت بإيقاف تشغيل التخزين المؤقت على مصدر البيانات وتم إصلاح جميع مشاكلي.

أذكر هذا فقط لأن الخطأ الذي كنت أواجهه يبدو مطابقًا لخطأك.لا أستطيع أن أرى كيف تسترد الكتاب في itemdatabound - وأنت لا تستخدم مصدر بيانات XML من خلال مظهر الأشياء ..... لكنني اعتقدت أن التعليق قد يؤدي إلى شيء ما بالنسبة لك.حظا سعيدا....على الرغم من أنه يبدو أنك قد انتقلت بالفعل :-).

هل التحكم في خانة الاختيار ReadOnly=true أم Enabled=false؟

لقد واجهت مشكلة مع عناصر التحكم باستخدام إحدى هذه الخصائص المحددة على النحو الوارد أعلاه وعدم التحديث بغض النظر عن الطريقة التي أحاول بها التعامل مع عنصر التحكم الموجود في الكود الموجود خلفه.أعتقد أن تعطيل حالة العرض سيتجاوز أيضًا هذه "الميزة" الصغيرة لـ ASP.NET، لكن الأمر يستحق المحاولة.

أيضًا، إذا تم فرز العناصر عبر رمز العميل، فهل يتم الحفاظ على هذا الترتيب في إعادة النشر؟لا أعتقد أنه يمكنك تغيير كائن CLR الموجود في الجلسة عبر جافا سكريبت.

لست متأكدًا مما إذا كان هذا مفيدًا، استبدل <%# Eval("ProjectAbbrev") %> بالارتباط التشعبي.Text المعين في أسلوب OnQueueRepeater_ItemDataBound وتأكد من تعبئة كافة الصفوف بشكل صحيح.

ربما لن يحل هذا مشكلتك، ولكن سيكون من المثير معرفة النتيجة.

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