SiteMap แผนที่เว็บไซต์มีประโยชน์มากในการสร้างเว็บไซต์ สามารถผูกเข้ากับตัวควบคุม Men และ TreeView ได้โดยตรง และมีตัวควบคุม SiteMapPath ที่ระบุเส้นทางปัจจุบัน ซึ่งสามารถผูกได้โดยตรงเช่นกัน
นี่คือคำจำกัดความ XML ที่ใช้กันทั่วไปของเขา:
<siteMapNode url="หลักสูตร/กลุ่ม/GroupList.aspx" title="GroupAdmin">
การอนุญาตของ SiteMap นี้ได้ถูกรวมเข้ากับการเป็นสมาชิก และแผนที่ที่ผู้ใช้เห็นด้วยการอนุญาตที่แตกต่างกันได้รับการควบคุม สามารถกำหนดค่าแอ็ตทริบิวต์บทบาทเพื่อขยายสิทธิ์การเข้าถึงสำหรับข้อยกเว้นได้ โปรดทราบว่านี่เป็นข้อยกเว้นสำหรับการอนุญาตการเข้าถึง
<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 ซึ่งจะถูกทริกเกอร์เมื่อมีการแยกวิเคราะห์เส้นทางปัจจุบัน นี่คือโค้ดส่วนหนึ่งจาก MSDN
private void Page_Load(ตัวส่งวัตถุ EventArgs e)
-
// เมธอด ExpandForumPaths ถูกเรียกให้จัดการ
// เหตุการณ์ SiteMapResolve
SiteMap.SiteMapResolve +=
ใหม่ SiteMapResolveEventHandler (this.ExpandForumPaths);
}
ส่วนตัว SiteMapNode ExpandForumPaths (ผู้ส่งวัตถุ, SiteMapResolveEventArgs e)
-
// โหนดปัจจุบันแสดงถึงหน้าโพสต์ในฟอรัมกระดานข่าว
// โคลนโหนดปัจจุบันและพาเรนต์ที่เกี่ยวข้องทั้งหมด
// ส่งคืนโหนดแผนผังเว็บไซต์ที่นักพัฒนาสามารถทำได้
// เดิน แก้ไขแต่ละคุณสมบัติ node.Url ตามลำดับ
// เนื่องจากโหนดที่ถูกโคลนนั้นแยกจากโหนดที่อยู่ด้านล่าง
// โครงสร้างการนำทางไซต์ การแก้ไขที่ทำไม่ได้
// ส่งผลต่อโครงสร้างการนำทางไซต์โดยรวม
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(จริง);
SiteMapNode tempNode = currentNode;
// รับ ID ล่าสุด
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// โหนดปัจจุบันและพาเรนต์สามารถแก้ไขได้
// ข้อมูลการสืบค้นแบบไดนามิกที่เกี่ยวข้องกับปัจจุบัน
// ดำเนินการตามคำขอ
ถ้า (0 != postID)
-
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
ถ้า ((null != (tempNode = tempNode.ParentNode)) &&
(0 != รหัสฟอรัม))
-
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
ถ้า ((null != (tempNode = tempNode.ParentNode)) &&
(0 != ฟอรั่มGroupID))
-
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
ส่งคืน currentNode;
-
รหัสนี้เพียงโหลดพารามิเตอร์สำหรับเส้นทางปัจจุบัน
ฉันได้ลองใช้วิธีการที่คล้ายกัน แต่เมื่อ SiteMapPath ได้รับการแก้ไขแล้ว เมนูก็ไม่สามารถเชื่อมโยงกับข้อมูลได้ และสามารถประมวลผลข้อมูลได้เพียงบางส่วนเท่านั้น
ต่อมา เมื่อรวมกับคลาส SiteMapTool ฉันเขียนฟังก์ชันหลายอย่างเพื่อแก้ไขปัญหานี้ นี่คือไฟล์แผนผังไซต์ที่แก้ไข โดยมีรายการการกำหนดค่าเพิ่ม: กฎ และพารามิเตอร์ภายในเป็นพารามิเตอร์ที่จำเป็นสำหรับหน้านี้ หากบริบทปัจจุบันไม่มีพารามิเตอร์เหล่านี้ ผู้ใช้จะถูกห้ามไม่ให้เข้าถึงหน้านี้
<siteMapNode url="หลักสูตร/กลุ่ม/GroupDetail.aspx" title="กฎรายละเอียดกลุ่ม" = "cid;gid">
เหล่านี้เป็นสองฟังก์ชันที่ประมวลผลเส้นทางทั้งหมดแบบวนซ้ำ MakeURL สตริงส่วนตัว (โหนด SiteMapNode)
-
โหนด ReadOnly = เท็จ;
// ค้นหา url แบบคงที่
string url = MySiteMap.FindForward (node.Title);
ถ้า (โหนด ["กฎ"] != null && โหนด ["กฎ"].ความยาว > 0)
-
//ถ้ามีกฎให้ตรวจสอบ
string[] paramSet = node["rule"].Split(';');
//ตรวจสอบ
สำหรับ (int i = 0; i < paramSet.Length; i++)
-
//หากคำขอไม่มีพารามิเตอร์ดังกล่าว ให้เรียกใช้ self เพื่อตรวจสอบผู้ปกครอง
ถ้า (HttpContext.Current.Request.Params [paramSet [i]] == null)
กลับ MakeURL (node.ParentNode);
-
//ถ้าผ่าน ให้เพิ่มพารามิเตอร์ทั้งหมดแล้วส่งคืนค่า
url += "?";
สำหรับ (int i = 0; i < paramSet.Length; i++)
-
คีย์สตริง = paramSet[i];
//'cid'--->'cid=1' รูปแบบเดิมจะเป็นดังนี้: rule='cid;tid'
url = url + คีย์ + "=" + HttpContext.Current.Request.Params[คีย์] + "&";
-
return url.Substring(0, url.Length - 1); // ลบอันสุดท้าย '&'
}
อื่น
-
//หากไม่มีกฎ ให้ส่งคืน url โดยตรง
URL ส่งคืน;
-
} ReBindData โมฆะส่วนตัว (รูต SiteMapNode)
-
สตริง url = MakeURL (รูท);
ถ้า (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 = NameValueCollection ใหม่();
//IEnumerator เช่น = smc.GetEnumerator();
// ในขณะที่ (ie.MoveNext())
-
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
//} อย่างไรก็ตาม เนื่องจากผู้ใช้ถูกจำกัดด้วยสิทธิ์เมื่อไม่ได้เข้าสู่ระบบ หน้าที่สามารถเข้าถึงได้จึงถูกจำกัด ดังนั้น SiteMap.RootNode.GetAllNodes(); จึงไม่ได้รับข้อมูลทั้งหมด จึงอาจเป็นเพียงบางส่วนหรือ 0 เท่านั้น
วิธีเปลี่ยนแปลงคือเขียนฟังก์ชันด้วยตัวเอง อ่านไฟล์ xml โดยตรง และรับคำจำกัดความของข้อมูลทั้งหมดแบบเรียกซ้ำ
ที่มา: BLOG ทำทุกอย่างที่คุณต้องการ