خريطة الموقع، خريطة الموقع، مفيدة جدًا عند إنشاء موقع ويب. يمكن ربطه مباشرةً بعنصري التحكم Men وTreeView، ويوجد عنصر تحكم SiteMapPath يشير إلى المسار الحالي، والذي يمكن أيضًا ربطه مباشرةً.
هذا هو تعريف XML الشائع الاستخدام:
<siteMapNode url="Course/Group/GroupList.aspx" title="GroupAdmin" >
تم دمج أذونات خريطة الموقع هذه مع العضوية، وتم التحكم في الخرائط التي يراها المستخدمون الذين لديهم أذونات مختلفة. يمكن تكوين سمة الدور لتوسيع أذونات الوصول للاستثناءات. لاحظ أن هذا استثناء لإذن الوصول.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">إليك بعض المقدمات :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple لن يتم وصف الاستخدام بالتفصيل هنا، ولكننا سنناقش كيفية توسيعه حتى يتمكن من الوصول إلى الموارد ذات المعلمات.
قم أولاً بتقديم مثل هذا المورد: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
لقد قدم هذا الصديق أداة يمكنها إعادة توجيه الطلبات باستخدام المعلمات الموجودة في البرنامج، مثل: MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
إنها بالفعل بسيطة وعملية.
الوظيفة التي نريدها الآن هي: نظرًا لأن كل مستوى سائل يتطلب معلمات مختلفة، في حالة عدم وجود هذه المعلمات، يُمنع المستخدم من الوصول إلى تلك الصفحة وبدلاً من ذلك يصل إلى الصفحة الرئيسية بشكل متكرر.
أولاً، يحتوي SiteMap نفسه على حدث SiteMapResolve، والذي يتم تشغيله عند تحليل المسار الحالي. وهذا جزء من التعليمات البرمجية من
Page_Load(object sender, EventArgs e) الخاص بـ
MSDN.
{
// يتم استدعاء أسلوب ExpandForumPaths للتعامل معه
// حدث SiteMapResolve.
SiteMap.SiteMapResolve +=
new SiteMapResolveEventHandler(this.ExpandForumPaths);
}
خاص SiteMapNode ExpandForumPaths(مرسل الكائن، SiteMapResolveEventArgs e)
{
// تمثل العقدة الحالية صفحة نشر في منتدى لوحة الإعلانات.
// استنساخ العقدة الحالية وجميع أصولها ذات الصلة This
// يُرجع عقدة خريطة الموقع التي يمكن للمطور بعد ذلك
// walk، قم بتعديل كل خاصية من خصائص العقدة.Url على التوالي.
// نظرًا لأن العقد المستنسخة منفصلة عن العقد الأساسية
// بنية التنقل في الموقع، الإصلاحات التي تم إجراؤها لا تفعل ذلك
// التأثير على بنية التنقل الشاملة للموقع.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode =currentNode;
// الحصول على المعرفات الحديثة.
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// يمكن تعديل العقدة الحالية والعقدة الأصلية لتضمينها
// معلومات سلسلة الاستعلام الديناميكية ذات الصلة حاليًا
// تنفيذ الطلب.
إذا (0!= معرف المشاركة)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != معرف المنتدى))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0!= معرف مجموعة المنتدى))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
إرجاع العقدة الحالية؛
}
يقوم هذا الرمز فقط بتحميل المعلمات للمسار الحالي.
لقد حاولت استخدام طريقة مشابهة، ولكن بمجرد إصلاح SiteMapPath، تعذر ربط القائمة بالبيانات. ويمكن معالجة جزء فقط من البيانات.
لاحقًا، قمت بدمجها مع فئة SiteMapTool، وكتبت عدة وظائف لحل هذه المشكلة. هذا هو ملف خريطة الموقع المعدل، مع إضافة عنصر التكوين: القاعدة، والمعلمات الموجودة بالداخل هي المعلمات المطلوبة لهذه الصفحة. إذا لم يكن السياق الحالي يحتوي على هذه المعلمات، فسيتم منع المستخدم من الوصول إلى هذه الصفحة.
<siteMapNode url="Course/Group/GroupDetail.aspx" title="تفاصيل المجموعة" القاعدة = "cid;gid">
هاتان الوظيفتان تعالجان كافة المسارات بشكل متكرر. سلسلة خاصة MakeURL (عقدة SiteMapNode)
{
ReadOnly = false;
// ابحث عن عنوان url الثابت
string url = MySiteMap.FindForward(node.Title);
إذا (عقدة["rule"] != فارغة && عقدة["rule"].Length > 0)
{
// إذا كان لديك القاعدة، ثم تحقق
string[] paramSet = العقدة["rule"].Split(';');
//يفحص
لـ (int i = 0; i <paramSet.Length; i++)
{
// إذا لم يكن الطلب يحتوي على مثل هذه المعلمة، فقم باستدعاء الذات للتحقق من والده
إذا (HttpContext.Current.Request.Params[paramSet[i]] == null)
return MakeURL(node.ParentNode);
}
// في حالة النجاح، قم بإضافة جميع المعلمات وإرجاع القيمة
URL += "؟";
لـ (int i = 0; i <paramSet.Length; i++)
{
مفتاح السلسلة = paramSet[i];
//'cid'--->'cid=1' التنسيق السابق يشبه: Rule='cid;tid'.
url = url + key + "=" + HttpContext.Current.Request.Params[key] + "&";
}
إرجاع url.Substring(0, url.Length - 1); // إزالة آخر "&"
}
آخر
{
// إذا لم تكن هناك قاعدة، قم بإرجاع عنوان url مباشرة
عنوان URL للإرجاع؛
}
} ReBindData باطلة خاصة (جذر SiteMapNode)
{
سلسلة عنوان url = MakeURL(root);
إذا (url! = "")
root.Url = url;
لـ (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
}استدعاء الدالة MakeUrl بشكل متكرر في ReBindData.
تأتي وظيفة MySiteMap.FindForward التي يتم استدعاؤها في وظيفة MakeUrl من تطبيق http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
ومع ذلك، يجب إجراء بعض التغييرات بعد التطبيق: يستخدم تطبيقه الأصلي فئات ثابتة للتحميل بهذه الطريقة
//SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
//siteMapCol = new NameValueCollection();
//IEnumerator ie = smc.GetEnumerator();
//بينما (أي.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
// ومع ذلك، نظرًا لأن المستخدم مقيد بالأذونات عند عدم تسجيل الدخول، فإن الصفحات التي يمكنه الوصول إليها تكون محدودة، لذلك لا يحصل SiteMap.RootNode.GetAllNodes(); على جميع البيانات، وقد تكون جزءًا منها أو 0.
طريقة تغييرها هي كتابة دالة بنفسك، وقراءة ملف xml مباشرة، والحصول على كافة تعريفات البيانات بشكل متكرر.
المصدر: مدونة افعل ما تريد