سؤال

لدي مشكلة في الحفاظ على الحالة في صفحة ASP.NET AJAX.نسخة مختصرة:أحتاج إلى طريقة ما لتحديث صفحة ViewState بعد إجراء رد اتصال غير متزامن، لتعكس أي تغييرات في الحالة أجراها الخادم أثناء المكالمة غير المتزامنة.

يبدو أن هذه مشكلة شائعة، لكنني سأصف السيناريو الخاص بي للمساعدة في التوضيح:

لدي عنصر تحكم يشبه الشبكة يحتوي على بعض تحسينات JavaScript - أي القدرة على سحب وإفلات الأعمدة والصفوف.عندما يتم إسقاط عمود أو صف في موضع جديد، يتم استدعاء أسلوب AJAX لإعلام جانب خادم التحكم وإطلاق حدث من جانب الخادم ("OnColumnMoved" أو "OnRowMoved").

تقوم مكالمات ASP.NET AJAX، بشكل افتراضي، بإرسال الصفحة بأكملها كطلب.بهذه الطريقة تمر الصفحة بدورة حياة كاملة، وتستمر حالة العرض وتتم استعادة حالة عنصر التحكم قبل استدعاء أسلوب RaiseCallbackEvent.

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

وتمتد هذه المشكلة إلى العديد من الآثار.على سبيل المثال، إذا كان لدينا إجراء من جانب العميل/AJAX لإضافة عنصر جديد إلى الشبكة، ثم تم سحب صف، فسيتم إنشاء الشبكة من جانب الخادم بعنصر واحد أقل من جانب العميل.

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

لذا، مرة أخرى، أحتاج إلى طريقة لتحديث صفحة ViewState عند رد الاتصال بعد تشغيل طريقة AJAX.

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

المحلول

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

نصائح أخرى

تحقق من مشاركة المدونة هذه: التغيير والتبديل في ICallbackEventHandler وViewstate.يبدو أن المؤلف يتناول الموقف ذاته الذي تواجهه:

لذا، عند استخدام ICallbackEventHandler، لديك عقبتان يجب التغلب عليهما حتى تتمكن من تحديث إدارة الحالة لعمليات الاسترجاعات.الأول هو مشكلة حالة العرض للقراءة فقط.والآخر هو في الواقع تسجيل التغييرات التي أجراها المستخدم على الصفحة قبل تشغيل رد الاتصال.

راجع مشاركة المدونة للحصول على اقتراحاته حول كيفية حل هذه المشكلة.تحقق من هذا أيضا مشاركة المنتدى الذي يناقش نفس المشكلة أيضًا.

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

لقد وجدت حلاً أنيقًا إلى حد ما مع Telerik's RadAjaxManager.إنه يعمل بشكل جيد جدًا، حيث تقوم بشكل أساسي بتسجيل كل عنصر تحكم قد يستدعي إعادة النشر، ثم تقوم بتسجيل كل عنصر تحكم يجب إعادة رسمه بعد إجراء إعادة النشر بشكل غير متزامن.سيقوم RadAjaxManager بتحديث DOM بعد إعادة النشر غير المتزامن وإعادة كتابة ViewState وجميع عناصر التحكم المتأثرة.بعد إلقاء نظرة خاطفة على العاكس، فإنه يبدو رتيبًا بعض الشيء تحت الغطاء، ولكنه يناسب أغراضي.

لا أفهم سبب استخدامك لعنصر تحكم مخصص لذلك، عندما يقوم ASP.NET AJAX UpdatePanel المدمج بنفس الشيء.

فهو يضيف المزيد من التعقيد، ويمنحك دعمًا أقل، ويجعل من الصعب على الآخرين العمل على تطبيقك.

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