نصيحة لبناء ديناميكية "البحث المتقدم" التحكم في ASP.NET

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

سؤال

النص البديل http://img3.imageshack.us/img3/1488/advancedsearch.png

أنا بناء "البحث المتقدم" في واجهة ASP.NET التطبيق.أنا لا تحتاج حتى إلى كتابة هذا الشيء بالنسبة لي ولكن أنا عالقة على مشكلة محددة بشأن التحكم الديناميكي و ViewState.أود الحصول على بعض التوجيه عن كيفية التعامل مع هذا.هنا هو بلدي الحالة:

المقادير:

  • فوضى مجموعة من API الكائنات تمثل كيانات حقول البحث ، الذي يتعامل مع بناء البحث ، توليد SQL و العودة النتائج.ذلك أن كل العناية.
  • ASP.NET 3.5

المطلوب واجهة وظائف:

(1) على تحميل الصفحة الأولية ، واجهة يحصل مسبقا الكائن البحث مع مجموعة من SearchCriterion الكائنات.فإنه يلزم لهم في مجموعة من الضوابط (انظر الصورة أعلاه).

  • بعض البنود البحث هي أبسط مثل:

    مجال (DropDownList) | مشغل (DropDownList) | قيمة (مربع نص)

  • البحث عن معيار الضوابط لبعض أنواع الحقول لديك المعلومات الهامة المخزنة في viewstate, مثل:

    مجال (DropDownList) | مشغل (DropDownList) | قيمة (DropDownList) حيث "القيمة" dropdownlist يسكنها استعلام قاعدة البيانات.

  • بعض حقول البحث إلى كيانات أخرى ، مما يسبب سلسلة من مجال محددات مثل:

    مجال (DropDownList) الحقل (DropDownList) | مشغل (DropDownList) | القيمة

(2) يعدل البحث عن طريق:

  • إضافة وإزالة معايير البحث من خلال النقر على أزرار منها
  • تكوين المعايير القائمة عن طريق تغيير الحقل المشغل ، أو القيمة.التغييرات الميدانية أو المشغل سوف تتطلب السيطرة على إعادة تشكيل نفسها من خلال تغيير المتاحة مشغلي تغيير "قيمة" تحكم الإدخال إلى نوع مختلف ، أو إضافة/إزالة DropDownLists من "الميادين" القسم إذا بحث من نوع الحقول المختارة/غير محددة.

(3) وأخيرا المستخدم يضرب "البحث" لرؤية النتائج.

المشكلة:

كما تعلمون بالفعل إذا كنت الإجابة على هذا السؤال ، ضوابط إضافتها بشكل حيوي إلى الصفحة تختفي على إعادة النشر.لقد خلق UserControl أن يتلاعب السيطرة جمع بدقة يحقق الخطوة (1) أعلاه كما ترون في الصورة المرفقة.(أنا لا تشعر بالقلق إزاء نمط في هذه النقطة, من الواضح.)

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

الحلول الممكنة

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

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

  • كنت أفكر في أنني قد تكون قادرة على إنجاز هذا باستخدام databound الضوابط - على سبيل المثال يمكنني ربط بلدي المعيار جمع مكرر والتي ثابت السيطرة جمع (ربما تخفي غير المستخدمة "قيمة" ضوابط استخدام داخلي مكرر لـ "الميدان" القوائم المنسدلة).ثم جميع المعلومات البقاء في ViewState...أليس كذلك ؟

  • أي أفكار جديدة سيكون موضع تقدير كبير.

شكرا على مساعدتك.ب.فاندانغو

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

المحلول

لقد تم ترميز لمدة يوم واحد و حصلت على هذا العمل جميل باستخدام الخيار الثالث اقترحت في سؤالي - المدرسة القديمة databound الضوابط.في الواقع أنا فقط فكرت في فكرة عندما كنت اضطر إلى كتابة السؤال بالتفصيل - ليس هذا فقط يحدث لك في كل وقت ؟

أضع SearchCriterionControl في asp:مكرر و لا بد أن الكائن جمع.بالنسبة منتقي أضع asp:DropDownList داخل متداخلة asp:مكرر و لا بد مجال مجموعة إلى ذلك.كل شيء يعمل بشكل جميل ، وتبقي الدولة ، في الواقع يتطلب القليل جدا من التعليمات البرمجية.لذا لم حيوي إضافة عناصر إلى الصفحة, شكرا لله.

شكرا على اقتراحاتكم, اندر, مات andrewWinn.

نصائح أخرى

حيث لا أحد قد اتخذت طعنة في هذا ل 2 ساعات, سوف أشارك في الحلبة مع الحل التي لا تعتمد على viewstate على الإطلاق (أو ASP.NET نموذج من postbacks).

ماذا لو أمسك كل قيم الإدخال مع مسج و بدلا من أن يفعل ما بعد العودة هل آخر ضد صفحة (أو نتائج جديدة.صفحة aspx)?أو يمكنك أن تجعل الأمر برمته asyncrhonous والقيام طلب اياكس ضد ويب طريقة الحصول على تغذية النتائج ، وملء على جانب العميل حسب الحاجة ؟

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

قراءة هنا لمزيد من المعلومات حول استخدام مسج ضرب ASP.NET الصفحة الأسلوب.تذكر - الصفحة يجب أن تكون أساليب ثابتة (انها سهلة الرقابة).

أنا لست متأكد أن ما تفعله من جانب الملقم لإنشاء الاستعلام الخاص بك - ولكن أود أن عالية يوصي LINQ.لم مماثلة "البحث المتقدم" وظيفة سابقا, و بعد عدة محاولات وجدت أن ينق كان أداة رائعة هذه المشكلة بغض النظر عن ما إذا كنت ضرب SQL مع LINQtoSQL أو مجرد ضرب في ذاكرة مجموعة من الكائنات.

هذا يعمل بشكل جيد لأن 1) LINQ هو تأجيل التنفيذ و 2) LINQ الاستعلام بإرجاع آخر queryable الكائن.والمعنى الضمني هنا هو أنه يمكنك سلسلة الخاص بك استعلامات LINQ معا كما كنت بناء عليها من المدخلات الخاصة بك بدلا من الاضطرار إلى القيام ضخمة واحدة شرط الترجمة إلى SQL أو أيا كان backstore كنت تستخدم (واحدة من محاولاتي كان بناء جمل SQL مع سلاسل, ولكن لا يزال يمر في إدخال البيانات عبر SQLParameters من أجل حقن SQL حماية - كان فوضوي و تعقيدا عندما وضعت اليد LINQ كانت أوامر من حجم أسهل للفهم والتنفيذ).

على سبيل المثال:

List<string> data; // or perhaps your a DB Context for LINQtoSQL?

var query = data.Where(item => item.contains("foo"));

if( {user supplies length search option} )
    query = query.Where(item => item.Length < 5);

// etc, etc.

// LINQ doesn't do anything until the query is iterated, at which point
// it will construct the SQL statement without you worrying about details or parameter binding
foreach(string value in query)
    ; // do something with the results

بسبب تأجيل التنفيذ و queryable نوع الإرجاع, يمكن لسلسلة استعلامات LINQ إلى هذا التعبير طوال اليوم والسماح لها تقلق بشأن تفاصيل التنفيذ (مثل تحويل استعلام SQL) في وقت التنفيذ.

أنا لا يمكن أن توفر لك مع الخطوات الدقيقة التي سوف تحتاج إلى القيام به ، ولكن أقترح بشدة تبحث في asp.net دورة حياة الصفحة.أنا خلقت المستخدم التحكم كما DLL وقت واحد.كان لالتقاط إعادة نشر البيانات في خطوات محددة في دورة الحياة وإعادة ربط البيانات في الخطوات الأخرى.بالإضافة إلى ذلك thinkgs مثل viewstate متوفرة فقط في بعض النقاط أيضا.وأنا أعلم أن كنت قد تجاوز On_init, On_prerender و بعض الطرق الأخرى.

آسف لا أستطيع المساعدة لكن ليس لدي رمز معي (مع القديم صاحب العمل).آمل أن يساعد هذا.

إذا كنت تقوم بإضافة عناصر التحكم شجرة حيوي ، تحتاج إلى إضافتها على postpack كذلك.فقط استدعاء الأسلوب الذي يبني السيطرة على Page_Load أو Page_Init والضوابط يجب أن تبقى على الصفحة على إعادة النشر.

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