SiteMap, карта веб-сайта, очень полезна при создании веб-сайта. Его можно привязать непосредственно к элементам управления Men и TreeView, а также имеется элемент управления SiteMapPath, указывающий текущий путь, который также можно привязать напрямую.
Это его часто используемое определение XML:
<siteMapNode url="Course/Group/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("Подробности", "AlbumID={0}&Page={1}", 1, 4);
Это действительно просто и практично.
Теперь нам нужна следующая функция: поскольку для каждого уровня жидкости требуются разные параметры, при отсутствии этих параметров пользователю запрещается доступ к этой странице, и вместо этого он рекурсивно обращается к родительской странице.
Прежде всего, сам SiteMap имеет событие SiteMapResolve, которое срабатывает при анализе текущего пути. Это фрагмент кода из MSDN
Private void Page_Load(object sender, EventArgs e).
{
// Метод ExpandForumPaths вызывается для обработки
// событие SiteMapResolve.
SiteMap.SiteMapResolve +=
новый SiteMapResolveEventHandler(this.ExpandForumPaths);
}
Private SiteMapNode ExpandForumPaths (отправитель объекта, SiteMapResolveEventArgs e)
{
// Текущий узел представляет страницу сообщения на форуме доски объявлений.
// Клонируем текущий узел и всех его родительских элементов This.
// возвращает узел карты сайта, который затем может использовать разработчик
// прогулка, поочередно изменяя каждое свойство node.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 != forumGroupID))
{
tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
}
Возврат текущего узла;
}
Этот код просто загружает параметры для текущего пути.
Я пробовал использовать аналогичный метод, но после исправления SiteMapPath меню невозможно было привязать к данным. И только часть данных может быть обработана.
Позже, в сочетании с классом SiteMapTool, я написал несколько функций для решения этой проблемы. Это измененный файл карты сайта с добавленным элементом конфигурации: rule, а параметры внутри — это параметры, необходимые для этой страницы. Если текущий контекст не имеет этих параметров, пользователю запрещен доступ к этой странице.
<siteMapNode url="Course/Group/GroupDetail.aspx" title="Сведения о группе" rule="cid;gid">
Это две функции, которые рекурсивно обрабатывают все пути. частная строка MakeURL (узел SiteMapNode)
{
узел.ReadOnly = ложь;
//находим статический URL
строка URL = MySiteMap.FindForward(node.Title);
if (узел["правило"] != ноль && узел["правило"].Длина > 0)
{
//если есть правило, то проверяем
string[] paramSet = node["правило"].Split(';');
//проверять
for (int i = 0; я <paramSet.Length; i++)
{
//если в запросе нет такого параметра, вызываем self, чтобы проверить его родителя
если (HttpContext.Current.Request.Params[paramSet[i]] == null)
вернуть MakeURL(node.ParentNode);
}
//если успешно, то добавляем все параметры и возвращаем значение
URL += "?";
for (int i = 0; я <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;
}
} Private void ReBindData (корень SiteMapNode)
{
строка URL = MakeURL (корень);
если (url != "")
root.Url = URL;
for (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 ie = smc.GetEnumerator();
//пока (т.е.MoveNext())
//{
// siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
// Однако, поскольку пользователь ограничен в разрешениях, когда он не авторизован, страницы, к которым он может получить доступ, ограничены, поэтому SiteMap.RootNode.GetAllNodes() не получает все данные, они могут быть только частью или 0.
Чтобы изменить это, нужно написать функцию самостоятельно, прочитать XML-файл напрямую и рекурсивно получить все определения данных.
Источник: БЛОГ Делай, что хочешь