سؤال

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

إذًا، ما هي أفضل طريقة لتعيين الصفحة الرئيسية في وقت التشغيل؟يمكن تعيين Page.MasterPageFile فقط في الحدث Page.OnPreInit.يبدو أن الحلول تتمثل في جعل كل صفحاتي ترث من قاعدة مشتركة تتعامل مع حدث PreInit، أو استخدام HttpModule الذي يقوم بذلك.

اي نصيحه؟

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

المحلول

لقد فعلت ذلك مرة من قبل، وفعلت بالضبط ما وصفته (جعل كل الصفحات ترث من صفحة مخصصة مع حدث OnPreInit).كما كان لدي Application_PreRequestHandlerExecute مخصص في Global.asax.cs الخاص بي لإعداد Page.StyleSheetTheme لإجراء تغييرات الصورة/css التي لا تتطلب صفحة رئيسية مختلفة.

نصائح أخرى

بدلاً من صفحتين رئيسيتين مختلفتين، ماذا عن وجود صفحة رئيسية واحدة تقوم ديناميكيًا بتحميل عناصر تحكم المستخدم المختلفة ومحتوى HTML الحرفي؟

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

ومع ذلك، أردت تعيين ملف MasterPageFile استنادًا إلى خاصية ملف التعريف، بحيث كان من الممكن أن يكون هناك حوالي 5 أسطر من التعليمات البرمجية في كل صفحة، وهو كابوس قابلية الصيانة.وعلى أية حال، "لا تكرر نفسك"، أليس كذلك؟

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

Public Module WebFunctions

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetMaster(ByVal page As Page)

        Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon)

        If pb IsNot Nothing Then
            page.MasterPageFile = pb.MasterPage
        End If

    End Sub

End Module

وبعد ذلك، في PreInit لكل صفحة، أسمي هذا:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        Me.SetMaster()
    End Sub

من السهل التعامل مع PreInit وإدراج سطر واحد من التعليمات البرمجية اللازمة لتحميل الصفحة الرئيسية المناسبة.

this.Page.MasterPageFile = "~/default.master";

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

أشعر بالفضول ما الذي يقرر الشكل الذي يجب أن تبدو عليه الصفحة؟هل يقوم المستخدم بالنقر فوق الزر لتغيير المظهر؟هل يعتمد ذلك على عنوان URL الذي تم استخدامه للوصول إلى الموقع؟

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

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

يحرر:

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

نظرًا لأنني لم أقم بتنفيذ هذا الحل مطلقًا، فأنا لست متأكدًا مما إذا كان يجب تشغيل علامة <HEAD> بأكملها على الخادم أم لا.


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>

وراثة جميع صفحاتك من فئة أساسية مثل

public class PageBase : System.Web.UI.Page
{
    public PageBase()
    {
        this.PreInit += new EventHandler(PageBase_PreInit);
    }
    void PageBase_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "~/MyMasterPage.Master";
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top