SiteMap, peta website, sangat berguna ketika membangun sebuah website. Itu bisa diikat langsung ke kontrol Men dan TreeView, dan ada kontrol SiteMapPath yang menunjukkan jalur saat ini, yang juga bisa diikat secara langsung.
Ini adalah definisi XML yang umum digunakan:
<siteMapNode url="Kursus/Group/GroupList.aspx" title="GroupAdmin" >
Izin Peta Situs ini telah digabungkan dengan Keanggotaan, dan peta yang dilihat oleh pengguna dengan izin berbeda telah dikontrol. Atribut peran dapat dikonfigurasi untuk memperluas izin akses untuk pengecualian. Perhatikan bahwa ini merupakan pengecualian terhadap izin akses.
<siteMapNode url="Course/Tests/TestList.aspx" title="TestAdmin" role="student">Berikut adalah beberapa perkenalan :
http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspxSimple Penggunaannya tidak akan dijelaskan secara detail disini, namun kita akan membahas bagaimana cara memperluasnya agar dapat mengakses resource dengan parameter.
Pertama-tama perkenalkan sumber daya seperti itu: MySiteMapTool: http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
Sobat telah menyediakan tool yang dapat meneruskan request dengan parameter yang ada di programnya, seperti: MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
Ini memang sederhana dan praktis.
Fungsi yang kita inginkan sekarang adalah: karena setiap level cairan memerlukan parameter yang berbeda, jika parameter tersebut tidak ada, pengguna dilarang mengakses halaman tersebut dan malah mengakses halaman induk secara rekursif.
Pertama-tama, SiteMap sendiri memiliki acara SiteMapResolve, yang dipicu ketika jalur saat ini diurai. Ini adalah bagian kode dari MSDN
private void Page_Load(pengirim objek, EventArgs e)
{
// Metode ExpandForumPaths dipanggil untuk menangani
// acara SiteMapResolve.
Peta Situs.SiteMapResolve +=
SiteMapResolveEventHandler baru(ini.ExpandForumPaths);
}
SiteMapNode ExpandForumPaths pribadi (Pengirim objek, SiteMapResolveEventArgs e)
{
// Node saat ini mewakili halaman Posting di forum papan buletin.
// Kloning node saat ini dan semua induknya yang relevan
// mengembalikan node peta situs yang kemudian dapat dilakukan oleh pengembang
// berjalan, memodifikasi setiap properti node.Url secara bergantian.
// Karena node yang dikloning terpisah dari node yang mendasarinya
// struktur navigasi situs, perbaikan yang dilakukan tidak
// mempengaruhi keseluruhan struktur navigasi situs.
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(benar);
SiteMapNode tempNode = currentNode;
// Dapatkan ID terbaru.
int forumGroupID = GetMostRecentForumGroupID();
int forumID = GetMostRecentForumID(forumGroupID);
int postID = GetMostRecentPostID(forumID);
// Node saat ini, dan induknya, dapat dimodifikasi untuk disertakan
// informasi string kueri dinamis yang relevan dengan saat ini
// menjalankan permintaan.
jika (0 != ID pos)
{
tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != ID forum))
{
tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
}
if ((null != (tempNode = tempNode.ParentNode)) &&
(0 != forumGroupID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
kembalikan Node saat ini;
}
Kode ini hanya memuat parameter untuk jalur saat ini.
Saya telah mencoba menggunakan metode serupa, tetapi setelah SiteMapPath diperbaiki, Menu tidak dapat terikat ke data. Dan hanya sebagian data yang dapat diproses.
Kemudian, dikombinasikan dengan kelas SiteMapTool, saya menulis beberapa fungsi untuk mengatasi masalah ini. Ini adalah file peta situs yang dimodifikasi, dengan item konfigurasi ditambahkan: aturan, dan parameter di dalamnya adalah parameter yang diperlukan untuk halaman ini. Jika konteks saat ini tidak memiliki parameter ini, pengguna dilarang mengakses halaman ini.
<siteMapNode url="Kursus/Group/GroupDetail.aspx" title="Rincian Grup" rule="cid;gid">
Ini adalah dua fungsi yang memproses semua jalur secara rekursif. string pribadi MakeURL (simpul SiteMapNode)
{
simpul.ReadOnly = false;
//temukan url statis
string url = Peta Situs Saya.FindForward(node.Judul);
if (simpul["aturan"] != null && simpul["aturan"].Panjang > 0)
{
//jika mempunyai aturan, maka periksa
string[] paramSet = simpul["aturan"].Split(';');
//memeriksa
untuk (int i = 0; i < paramSet.Panjang; i++)
{
//jika permintaan tidak memiliki param seperti itu, maka panggil self untuk memeriksa induknya
if (HttpContext.Saat ini.Permintaan.Params[paramSet[i]] == null)
return MakeURL(node.ParentNode);
}
//jika lolos, tambahkan semua parameter dan kembalikan nilainya
url += "?";
untuk (int i = 0; i < paramSet.Panjang; i++)
{
kunci string = paramSet[i];
//'cid'--->'cid=1'. format sebelumnya seperti : rule='cid;tid'.
url = url + kunci + "=" + HttpContext.Saat ini.Permintaan.Params[kunci] + "&";
}
return url.Substring(0, url.Length - 1); //hapus '&' terakhir
}
kalau tidak
{
//jika tidak ada aturan maka langsung kembalikan urlnya
kembalikan url;
}
} kekosongan pribadi ReBindData (root SiteMapNode)
{
string url = MakeURL(root);
jika (url != "")
root.Url = url;
untuk (int i = 0; i < root.ChildNodes.Count; i++)
{
ReBindData(root.ChildNodes[i]);
}
}Panggil fungsi MakeUrl secara rekursif di ReBindData.
Fungsi MySiteMap.FindForward yang dipanggil dalam fungsi MakeUrl berasal dari implementasi http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx .
Namun, beberapa perubahan perlu dilakukan setelah aplikasi: implementasi aslinya menggunakan kelas statis untuk memuat seperti ini
//SiteMapNodeCollection smc = Peta Situs.RootNode.GetAllNodes();
//siteMapCol = NameValueCollection();
//IEnumerator yaitu = smc.GetEnumerator();
//sementara (yaitu.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Judul] = ((SiteMapNode)ie.Current).Url;
//} Namun, karena pengguna dibatasi oleh izin saat tidak login, halaman yang dapat diakses juga terbatas, sehingga SiteMap.RootNode.GetAllNodes(); tidak mendapatkan semua data, mungkin hanya sebagian atau 0.
Cara mengubahnya adalah dengan menulis fungsi sendiri, membaca file xml secara langsung, dan mendapatkan semua definisi data secara rekursif.
Sumber: BLOG Lakukan apapun yang Anda inginkan