غاية:
تحقيق استخدام ملف .cs في MasterPage لاستبدال PageBase في المشروع.
تحفيز:
الدافع لكتابة هذا المقال يأتي من إعادة بناء المشروع. في مشروع بنية B/S الخاص بـ .Net Framwork 2.0، تم استخدام تقنيات PageBase وMasterPage، وقد وجد أنه في كل مرة يتم فيها الوصول إلى الصفحة، تصل الصفحة إلى PageBase وMasterPage في نفس الوقت، مما لا يؤدي فقط إلى تدهور الأداء، ولكن قد يسبب مشاكل في توسيع وظيفة المشروع المستقبلية وتعديل الأخطاء المنطقية.
الجوانب الفنية:
PageBase: تقنية تُستخدم غالبًا في .Net Framework 1.1 لتغليف نفس الوظيفة لصفحات متعددة. ترث فئة PageBase.cs من فئة System.Web.UI.Page ترث صفحات الويب في المشروع من فئة PageBase.cs، وذلك من خلال تجاوز أسلوب تهيئة الصفحة في الفئة الأساسية، ويتم استدعاء وظائف الأعمال في PageBase. مثل: التحقق من معلمات URL وحفظ الزيارات والوظائف الأخرى (لمعرفة طرق التنفيذ المحددة، يرجى الرجوع إلى المثال الرسمي لـ Microsoft duwamishi).
MasterPage: ميزة جديدة في .Net Framework 2.0 وهي تشتمل فعليًا على ملفين: ملف .Master (علامة html) وملف .cs (رمز C#). ينفذ الملف .Master رسم طبقة العرض، وينفذ الملف .cs وظائف محددة. يمكن لصفحات الويب التي ترث من MasterPage أن ترث محتوى طبقة العرض في MasterPage. لرسم رأس وتذييل مشترك وتخصيص تخطيط موحد، يعد MasterPage خيارًا جيدًا.
متطلبات المحاكاة:
استخدم تقنية MasterPage لاستبدال PageBase لتنفيذ التحقق من معلمة شريط العناوين.
لنقدم شرحًا بسيطًا، معلومات جدول تسجيل الدخول في قاعدة البيانات هي كما يلي:
بعد تسجيل الدخول إلى النظام، توجد معلمات في شريط عنوان URL، كما يلي:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
في هذا الوقت، يقوم المستخدم يدويًا بتعديل المعلمات في شريط عنوان URL على النحو التالي:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
تعتبر هذه عملية غير قانونية وسيعود النظام تلقائيًا إلى صفحة تسجيل الدخول.
تكرار الكود الأول:
1. ارجع إلى طريقة PageBase التقليدية:
نهج الصفحة التقليدي هو:
PageBase للفئة العامة: System.Web.UI.Page
{
publicPageBase()
{
}
/**//// <الملخص>
/// طريقة الإدخال
/// </الملخص>
تهيئة الفراغ المحمي ()
{
// أدخل منطق العمل المشترك
}
}
صفحة على الإنترنت:
صفحة الاختبار الجزئية العامة: PageBase
{
// الطريقة التقليدية للاتصال بـ PageBase
/**///// <الملخص>
/// تجاوز طريقة OnPreInit () للفئة الأساسية واستدعاء طريقة التحقق العامة
/// </الملخص>
/// <param name="e"></param>
تجاوز محمي باطل OnInit (eventargs e)
{
base.Initialize();
}
}
اتبع هذا الأسلوب وانقل التعليمات البرمجية الموجودة في PageBase إلى MasterPage:
MasterPage.cs:
فئة عامة جزئية MyMasterPage: System.Web.UI.MasterPage
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
إذا (!IsPostBack)
{
// طريقة التحقق من المكالمة
تهيئة();
}
}
}
قم بتعديل الكود الموجود في صفحة الويب إلى:
صفحة الاختبار الجزئية العامة: System.Web.UI.Page
{
// قم بتقليد طريقة PageBase واستدعاء الطريقة في Master
/**//// <الملخص>
/// تجاوز طريقة OnPreInit () للفئة الأساسية واستدعاء طريقة التحقق العامة
/// </الملخص>
/// <param name="e"></param>
تجاوز محمي باطل OnInit (eventargs e)
{
// احصل على مرجع الصفحة الرئيسية
MyMasterPage myMasterPage = (MyMasterPage)this.Master;
// اتصل بطريقة التحقق العامة في الصفحة الرئيسية
إذا (!IsPostBack)
{
myMasterPage.Initialize();
}
}
}استبدل طريقة التهيئة () في MasterPage بالطريقة الموجودة في المثيل، رمز الاختبار:
الخطوة 1: قم بتسجيل الدخول إلى النظام باستخدام اسم المستخدم zhangsan، وتم تسجيل الدخول بنجاح.
توضح الصفحة أن zhangsan مرحب به لتسجيل الدخول.
يظهر عنوان URL:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
الخطوة 2: تعديل شريط عنوان URL يدويًا: كما يلي:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
لن تعرض الصفحة تسجيل الدخول الترحيبي، ولكنها ستعود مرة أخرى إلى صفحة تسجيل الدخول.
انعكاس: على الرغم من تنفيذ الوظيفة، لا تزال هناك بعض الروابط غير المرضية:
1. يجب أن تكون الطريقة التي تستدعيها الفئة الفرعية في Master طريقة عامة؛
2. على الرغم من عدم الحاجة إلى تعديل وراثة صفحة الويب، لا يزال يتعين عليك نسخ ولصق وتجاوز طريقة OnInit() للفئة الأساسية ميكانيكيًا.
ومن أجل التخلص من هذه المشاعر العالقة، بدأت:
تكرار الكود الثاني:
تعديل الكود في MasterPage.cs:
فئة عامة جزئية MyMasterPage: System.Web.UI.MasterPage
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
إذا (!IsPostBack)
{
// طريقة التحقق من المكالمة
CheckLogin();
}
}
/**//// <الملخص>
/// تحقق مما إذا كان الوصول قانونيًا
/// </الملخص>
CheckLogin باطل خاص ()
{
// إذا كان الرقم موجودًا في عنوان URL أو الرقم الموجود في ملف تعريف الارتباط
إذا (string.IsNullOrEmpty(Request.QueryString["id"])
||.string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id"))).
{
Response.Redirect("Login.aspx");
}// إذا كان الرقم الموجود في عنوان URL لا يتطابق مع الرقم الموجود في ملف تعريف الارتباط، فارجع إلى صفحة تسجيل الدخول
وإلا إذا (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}بعد إعادة الإعمار، لا يمكن تعديل صفحة الويب بأي شكل من الأشكال. تستدعي MasterPage تلقائيًا طريقة التحقق في طريقة Page_Load() الخاصة بها، وتقوم بتعيين طريقة التحقق على خاصة، والتي لا يمكن استدعاؤها إلا بواسطة MasterPage نفسها لتحسين الأمان. في هذه المرحلة، يبدو أن الكود مثالي للاختبار:
الخطوة 1: قم بتسجيل الدخول إلى النظام باستخدام اسم المستخدم zhangsan.
لا تزال صفحة تسجيل دخول المستخدم معروضة.
فشل الاختبار.
استخدم نقاط التوقف لتتبع التعليمات البرمجية واكتشف أن المشكلة تحدث في مقتطف التعليمات البرمجية في أسلوب CheckLogin() في MasterPage.cs:
إذا (string.IsNullOrEmpty(Request.QueryString["id"])
||string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id"))).
{
Response.Redirect("Login.aspx");
}
نظرًا لأن صفحة تسجيل الدخول ترث من MasterPage، يتم استدعاء طريقة التحقق في MasterPage.cs تلقائيًا عند تحميل الصفحة، ولا تفي المعلمات الخاصة بها بطريقة string.IsNullOrEmpty()، لذلك تنتقل مرة أخرى إلى صفحة تسجيل الدخول يتم تحميل الصفحة مرة أخرى ويتم استدعاء طريقة التحقق في الفئة الأساسية، وبالتالي تشكيل حلقة لا نهائية.
في تقنية PageBase، يمكن لصفحات الويب أن ترث بشكل انتقائي من PageBase، ولكن في تقنية MasterPage، من أجل الحصول على تأثير طبقة عرض متسقة، تكون انتقائية صفحات الويب لوراثة MasterPage منخفضة جدًا، ولا ينبغي لنا إنشاء نفس العرض عن طريق إنشاء جديدة، يتم استخدام MasterPage بدون رمز التحقق لوراثة صفحات الويب التي لا تحتاج إلى وراثة وظائف الفئة الأساسية. ولحل هذه المشكلة، بدأ التكرار الثالث:
استيراد ملف التكوين:
<?xml version="1.0" encoding="utf-8" ?>
<الصفحات>
<صفحة الاختبار>
<عنوان الصفحة = "TestPage" url = "TestPage.aspx" needvalidate = "true"/>
<عنوان الصفحة = "تسجيل الدخول" url = "Login.aspx" needvalidate = "false"/>
</testpage>
<صفحات المشرف>
<عنوان الصفحة = "Page1" url = "~/Admin/Page1.aspx" needvalidate = "false"/>
<عنوان الصفحة = "Page2" url = "~/Admin/Page2.aspx" needvalidate = "false"/>
</adminpages>
</الصفحات>
كما ترون، تم تحديد الصفحات التي تحتاج إلى التحقق منها (needvalidate="true").
إنشاء فئة الوصول إلى بيانات Xml:
الطبقة العامة XmlDAL
{
سلسلة ثابتة خاصة filePath = string.Empty؛
ثابت XmlDAL()
{
// تهيئة مسار ملف التكوين
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <الملخص>
/// احصل على قائمة الصفحات التي تحتاج إلى التحقق منها
/// </الملخص>
/// <returns>قائمة الصفحات التي تتطلب التحقق</returns>
Ilist العامة الثابتة <string> GetValidatePages ()
{
صفحات IList<string> = قائمة جديدة<string>();
// إذا كان ملف التكوين المحدد موجودًا
إذا (System.IO.File.Exists(filePath))
{
يحاول
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
// احصل على العقدة الجذرية لملف التكوين
XmlNode root = xmlDoc.DocumentElement;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeListNodeList = root.SelectNodes(xpath);
// جمع عقدة الراحة
foreach (عقدة XmlNode في قائمة العقد)
{
pages.Add(node.Attributes["title"].Value);
}
}
قبض (استثناء على سبيل المثال)
{
رمي استثناء جديد (ex.Message)؛
}
}
صفحات العودة؛
}
}
أعد معالجة الكود الموجود في MasterPage.cs وأضف طريقة IsValidateNeeded(string url) لاكتشاف ما إذا كانت الصفحة الحالية تتطلب التحقق أم لا. قم بتعديل طريقة التحقق:
فئة عامة جزئية MyMasterPage: System.Web.UI.MasterPage
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
إذا (!IsPostBack)
{
// طريقة التحقق من المكالمة
CheckLogin();
}
}
/**//// <الملخص>
/// تحقق مما إذا كان الوصول قانونيًا
/// </الملخص>
CheckLogin باطل خاص ()
{
// تحديد ما إذا كانت الصفحة التي يتم الوصول إليها حاليًا تتطلب التحقق
إذا (IsValidateNeeded(Request.RawUrl))
{
// إذا كان الرقم موجودًا في عنوان URL أو الرقم الموجود في ملف تعريف الارتباط
إذا (string.IsNullOrEmpty(Request.QueryString["id"])
||.string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id"))).
{
Response.Redirect("Login.aspx");
}// إذا كان الرقم الموجود في عنوان URL لا يتطابق مع الرقم الموجود في ملف تعريف الارتباط، فارجع إلى صفحة تسجيل الدخول
وإلا إذا (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**//// <الملخص>
/// تحقق مما إذا كانت الصفحة الحالية تتطلب التحقق
/// </الملخص>
/// <param name="currentPage">اسم الصفحة الحالية</param>
/// <returns>ما إذا كانت الحالة بحاجة إلى التحقق</returns>
المنطق المنطقي الخاص IsValidateNeeded (سلسلة عنوان url)
{
bool isNeeded = false;
// تُرجع طريقة GetValidatePages () قائمة الصفحات التي تحتاج إلى التحقق منها
صفحات IList<string> = XmlDAL.GetValidatePages();
IEnumerator<string> ie = pages.GetEnumerator();
بينما (أي.MoveNext())
{
// إذا كانت الصفحة الحالية تتطلب التحقق
إذا (url.Contains(ie.Current))
// العودة إلى الحالة التي تتطلب التحقق
العودة مطلوبة = صحيح؛
}
العودة مطلوبة؛
}
}
للاختبار:
الخطوة 1: قم بتسجيل الدخول إلى النظام باستخدام اسم المستخدم zhangsan، وتم تسجيل الدخول بنجاح.
توضح الصفحة أن Zhangsan مرحب به لتسجيل الدخول.
يظهر عنوان URL:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
الخطوة 2: تعديل شريط عنوان URL يدويًا: كما يلي:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
لن تعرض الصفحة تسجيل الدخول الترحيبي، ولكنها ستعود مرة أخرى إلى صفحة تسجيل الدخول.
بهذا ينتهي تكرار الكود الخاص بي.
تحميل الكود: