تمت إعادة ترتيب عناصر ListBox باستخدام JavaScript مما تسبب في حدوث خطأ في التحقق من صحة الحدث عند إعادة النشر

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

سؤال

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

إعادة النشر أو وسيطة رد الاتصال غير صالحة.يتم تمكين التحقق من صحة الحدث باستخدام التكوين أو <%@ Page EnableEventValidation="true" %> في الصفحة.لأغراض أمنية، تتحقق هذه الميزة من أن وسيطات أحداث إعادة النشر أو رد الاتصال تنشأ من عنصر تحكم الخادم الذي قدمها في الأصل.إذا كانت البيانات صحيحة ومتوقعة، استخدم أسلوب ClientScriptManager.RegisterForEventValidation لتسجيل بيانات إعادة النشر أو رد الاتصال للتحقق من صحتها.

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

تطبيق الاختبار

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

المحلول 3

والخيار الأول سيجلب فوق كبيرا. لقد تعرف بلدي تحكم مربع القائمة مخصصة مشتقة من فئة مربع القائمة، وأجرى تجاوز البيانات loadpostback:

public class CustomListBox : ListBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        return true;
    }
}
<ع> استخدام هذا بدلا من مربع القائمة العادي في التحكم المستخدم بلدي تحل المشكلة، ولكن هل هناك أي مخاطر مرتبطة مع وجهة نظري؟

نصائح أخرى

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

1) أبسط هو أن تفعل منطق مبادلة على الملقم بدلا من استخدام جافا سكريبت. وبهذه الطريقة سيتم الحفاظ على حالة العرض بين إعادات النشر والنفقات العامة المضافة للرحلات ذهابا وإيابا متعددة إلى ملقم قد لا يكون مشكلة.

2) إذا كانت رحلات ذهابا وإيابا متعددة إلى خادم هي قضية والكتابة عنصر تحكم ملقم الذي يعالج انها حالة العرض الخاصة. وهذا بالطبع نهج إشراك الكثير.

و3) نهج وسطا يمكن أن يكون لاستخدام قائمتين أتش تي أم أل بسيطة (مجرد كتابة علامات HTML بدون استخدام الضوابط asp.net) والحفاظ على العميل من جافا سكريبت قائمة لمعرف في حقل مخفي. على بعد الظهر فقط تحليل الحقل المخفي واستخراج هوية لتجاهل قوائم أتش تي أم أل.

واود ان اذهب مع 1 إذا كانت هناك حجج ليست خطيرة ضدها.

بعض الخيارات الممكنة:

  • إذا أمكن، قم بتعطيل ViewState في القائمتين.بدون ViewState، لن يعرف الخادم ما هي القيم الأصلية وبالتالي لن يخطئ.باستخدام هذا الأسلوب، ستحتاج إلى إعادة ملء القوائم (بسبب نقص حالة العرض) وقد تحتاج إلى تتبع التحديد يدويًا - أو ستحتاج إلى ملء القوائم أثناء مرحلة OnInit.

  • قم بإيقاف تشغيل التحقق من صحة الحدث (إذا استطعت)

  • قم بملء كلتا القائمتين بالكامل على جانب الخادم واستخدم البرنامج النصي من جانب العميل (جافا سكريبت) لإزالة الإدخالات من القائمتين كما هو مطلوب.

وبالصدفة، هل حاول هذا بالفعل؟ هل هذا كلما الوحل مع قائمة بأي شكل من الأشكال.

document.getElementById("listbox").selectedIndex = -1;

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

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

<select runat="server" id="myList" multiple="true" />

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

protected override void Render(HtmlTextWriter writer)
{
  foreach (DictionaryEntry entry in ColumnConfig) {          
    Page.ClientScript.RegisterForEventValidation(lstbxColumnsToExport.UniqueID,(string)entry.Key);
    Page.ClientScript.RegisterForEventValidation(lstbxNonExportColumns.UniqueID,(string)entry.Key);
  }
  base.Render(writer);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top