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

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

  •  01-07-2019
  •  | 
  •  

سؤال

أقوم بإضافة بعض عناصر تحكم المستخدم ديناميكيًا إلى عنصر تحكم خادم PlaceHolder.يتكون عنصر تحكم المستخدم الخاص بي من بعض التسميات وبعض عناصر التحكم في مربع النص.

عندما أقوم بإرسال النموذج ومحاولة عرض محتويات مربعات النص (داخل كل عنصر تحكم مستخدم) على الخادم، تكون فارغة.

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

هل يمكن لأحد أن يخبرني لماذا لا أرى البيانات التي أدخلها المستخدم على الخادم؟

شكرا على اي مساعدة.

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

المحلول

يعتمد هذا على تسلسل أحداث .NET v1، لكنه يجب أن يعطيك الفكرة:

  • التهيئة (حدث التهيئة)
  • بدء تتبع حالة العرض (يتحقق من إعادة النشر)
    • تحميل حالة العرض (في حالة إعادة النشر)
    • تحميل بيانات إعادة النشر (في حالة إعادة النشر)
  • تحميل (حدث التحميل)
    • رفع الأحداث المتغيرة (في حالة إعادة النشر)
    • رفع أحداث إعادة النشر (في حالة إعادة النشر)
  • العرض المسبق (حدث العرض المسبق)
  • حفظ حالة العرض
  • يجعل
  • إلغاء التحميل (حدث إلغاء التحميل)
  • تخلص

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

نصائح أخرى

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

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

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

تأكد من تحديد عناصر التحكم الديناميكية الخاصة بك على مستوى الفصل الدراسي وإضافتها إلى حاوية ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

وعندما تقوم بإنشاء عنصر التحكم، تأكد من استدعاء LoadControl حتى تتم إضافة الكائن بشكل صحيح:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

يجب عليك إنشاء عناصر التحكم الخاصة بك في معالج الأحداث Page_PreInit.يعد نموذج التحكم في خادم ASP.NET أمرًا صعبًا؛عليك أن تفهم تماما دورة حياة الصفحة للقيام بذلك بشكل صحيح.

كما قال آخرون، أي شكل من أشكال التلاعب بالتحكم يجب أن يتم قبل إنشاء حالة العرض.

فيما يلي رابط جيد في دورة حياة الصفحة لمساعدتك:

http://msdn.microsoft.com/en-us/library/ms178472.aspx

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

آمل أن يساعد هذا قليلا.

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

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