سؤال

نحن نكتب تطبيق بحث يحفظ معايير البحث في حالة الجلسة وينفذ البحث داخل لوحة تحديث asp.net.في بعض الأحيان عندما نقوم بتنفيذ عمليات بحث متعددة على التوالي، فإن البحث الثاني أو الثالث سيعرض أحيانًا نتائج من المجموعة الأولى من معايير البحث.

مثال:بحثنا الأول هو البحث عن "John Smith" -> يتم عرض نتائج John Smith.البحث الثاني نقوم به وهو البحث عن "Bob Jones" -> يتم عرض نتائج John Smith.

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

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

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

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

المحلول

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

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

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

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

يمكنك استخدام عنصر تحكم المستخدم لعرض نتائج البحث من خلال خدمة ويب (أسرع بكثير من UpdatePanel): http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

أو يمكنك إرجاع نتائج البحث بتنسيق JSON وعرضها على جانب العميل (حتى بشكل أسرع): http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to-build-a-client-side-repeater/

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

نصائح أخرى

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

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

التعديل رقم 2:لم أكن لأتمكن من كتابة ما كتبته أعلاه (الفقرة الأولى) لو لم أكن معجبًا بشخص أجاب أيضًا: https://stackoverflow.com/users/60/dave-ward

تحتاج إلى تعيين خاصية EnableSession للسمة WebMethod للوظيفة التي تتصل بها.

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}

إذا كنت تستخدم معالجات عامة .ashx، فما عليك سوى استخلاصها من واجهة IRequiresSessionState

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top