يوفر ASP.Net أشكالًا للموضوعات، وهي في الواقع تغييرات في المظهر. ومع ذلك، يقول العديد من الأشخاص على الإنترنت أن هذا الشيء عديم الفائدة، قائلين إنه يمكن استخدام هذا الشيء في صفحات .aspx، ولكن لا يمكن استخدامه في الصفحات الرئيسية (MasterPage). نعم، صحيح أنه لا يمكنك تبديل سمة موقع الويب بالكامل مباشرة من خلال تحديد DDL في MasterPage، لأنه تم تعيين خاصية Page.Theme في PreInit(){}، وإلا فسيتم الإبلاغ عن خطأ، ولن يتم تنفيذ MasterPage PreInit().
آمل أن يساعد هذا المثال الجميع في حل هذه المشكلة. لكي يتمكن الجميع من فهم كود المصدر الخاص بي بشكل أفضل، سأقدمه بإيجاز أدناه.
دعونا نتحدث أولاً عن الفكرة: هدفنا هو وضع قائمة DropDownList في الصفحة الرئيسية، عن طريق تبديل قائمة DropDownList (لا أستخدم DropDownList هنا، ولكن استخدم Css لمحاكاة "DropDownList" حيث يتم وضع LinkButton في كل عنصر، و كل LinkButtond قيمة PostBackUrl موجودة في النموذج: "~/ThemeTool.aspx?Theme=theme name" ) لتغيير سمة موقع الويب بالكامل، بدلاً من مجرد تغيير الصفحة الحالية، تمامًا مثل صفحة Discuz!، لذا هذا التغيير عالمي، ولكنه خاص بالخيط الحالي، أي أن المستخدم "أ" يغير السمة، وهو فعال فقط للمستخدم "أ" وليس له أي تأثير على المستخدم "ب"، لذلك لن نتطرق إلى ملف التكوين بعد ذلك فكر بسرعة في الجلسة. نعم، نحتاج إلى وضع اسم السمة في الجلسة، مثل Session["Theme"]="Blue" بهذه الطريقة، تحتاج كل صفحة فقط إلى الحصول على قيمة الجلسة Page_PreInit() وقم بتعيينه إلى سمة Page.Theme الخاصة بالصفحة، وسيكون الأمر على ما يرام.
عندما نغير خيار "DropDowList"، أقوم هنا بالنقر فعليًا على زر رابط مختلف، مما يعني تغيير اسم السمة، مما يعني تغيير قيمة الجلسة ["الموضوع"]. هذا "التغيير" أين يتم تنفيذه؟ هذا أمر بالغ الأهمية هل هو في LinkButton_Click()؟ لا، لأن إعادة الحصول على Page.Theme يجب أن تكون في Page_PreInit()، وLinkButton_Click() يحدث في وقت متأخر جدًا، بعد التحميل، ناهيك عن PreInit()، لذلك أنتقل إلى ThemeTool هنا الذي تمت معالجته بتنسيق .aspx، ثم أعيد توجيهه إلى الصفحة الأصلية بعد المعالجة، بحيث تتغير قيمة الجلسة ["Theme"] قبل PreInit() للصفحة الأصلية. يرجى التأكد من أن هذه العملية لن تتسبب في تحميل ThemeTool في المتصفح لقد استعرت للتو Page_PreInit() وغادرت فورًا بعد استخدامه، هاها! !
حسنًا، هذه هي الفكرة، فلنقدم الملفات الثلاثة التالية:
1. MasterPage.master، ما تجدر الإشارة إليه في هذا الملف هو "DropDownList" الخاص بي الذي تمت محاكاته باستخدام CSS. يحتوي كل عنصر في "DropDownList" على LinkButton، وقيمة كل PostBackUrl الخاصة بـ LinkButtond هي في النموذج: "~/ThemeTool. aspx?Theme=Theme name"، بحيث في كل مرة يتم فيها تغيير خيار "DropDownList"، سيتم تمرير قيمة سمة جديدة إلى ThemeTool.aspx، ثم سيقوم ThemeTool.aspx بمعالجة قيمة السمة الجديدة وتخزينها في الجلسة. .
2. يوجد ملف ThemeSkin.cs في مجلد App_Code، والذي يحتوي على طريقتين ثابتتين: GetTheme(Page P) وGetTheme(Page P) يُستخدم للحصول على السمة يتم استدعاؤه في Page_PreInit() لكل صفحة تحتاج إلى سمة (أنا هنا Default.aspx وDefault2.aspx l). تشير المعلمة P إلى الصفحة التي تستدعي الطريقة، وهي كائن من نوع الصفحة؛ يتم استخدام ChangeTheme() لتبديل السمة التي يتم استدعاؤها في Page_PreInit() في ThemeTool.aspx.cs.
3. تعد صفحة ThemeTool.aspx الموجودة في الدليل الجذر مهمة جدًا أيضًا. ويتم تبديل السمة في Page_PreInit الخاصة بها. من الذي أخبر MasterPage بعدم تنفيذ PreInit؟ الكود الموجود بالداخل بسيط للغاية، إذا كنت لا تصدقني، قم بإلقاء نظرة.
يوسع