Несколько узлов SiteMap с одним URL с параметрами строки запроса
В элементе управления SiteMap, который я использую, я хочу, чтобы 2 или более моих узлов указывали на одну и ту же страницу.
<siteMapNode url="~/Default.aspx" title="Home" description="Home page">
<siteMapNode url="~/SectionList.aspx" title="By section" description="List of sections">
<siteMapNode url="~/BrowsePublications.aspx" title="publications of section" description="Publications of section"/>
</siteMapNode>
<siteMapNode url="~/Officers.aspx" title="By responsible officer" description="List of officers">
<siteMapNode url="~/BrowsePublications.aspx" title="publications of officer" description="Publications of officer"/>
</siteMapNode>
</siteMapNode>
У меня в основном есть сетка, чтобы показать, эта сетка может быть отфильтрована разными способами. Каждый фильтр - это страница, на которой пользователь щелкает определенную запись и перенаправляется на страницу, показывающую сетку с данными, относящимися к этой записи. Я использую параметры строки запроса для достижения этого. Я читал в Интернете, что один из способов преодолеть это ограничение - добавить фиктивные параметры или "#" в конец URL-адресов дублирующих узлов, поэтому я попытался с этим
<siteMapNode url="~/Default.aspx" title="Home" description="Home page">
<siteMapNode url="~/SectionList.aspx" title="By section" description="List of sections">
<siteMapNode url="~/BrowsePublications.aspx?view=2" title="Publication view 1" description="Publication view"/>
</siteMapNode>
<siteMapNode url="~/Officers.aspx" title="By responsible officer" description="List of officers">
<siteMapNode url="~/BrowsePublications.aspx?view=3" title="Publication view" description="Publication view"/>
</siteMapNode>
</siteMapNode>
а также с использованием хэшей, но так как я перенаправляю на BrowsePublications.aspx с параметрами запроса, (мой URL-это что-то вроде
BrowsePublications.aspx? Вид =2& с = 24
asp.net не распознал его, и я получил исключение, когда попытался получить доступ к SiteMap.CurrentNode из BrowsePublications.aspx. Что является самым простым способом добиться этого. Спасибо
1 ответ
Некоторое время я пытался сделать то, что вы просили. Существует эффективный и простой способ иметь 2 одинаковых URL-адреса (с разными строками запроса) в разных узлах карты сайта. Мысль опубликовать решение, чтобы кто-нибудь в будущем выиграл от него.
Во-первых, вам нужен родительский узел и родительский родительский узел, уже присутствующий в карте сайта.
<siteMapNode title="" description="" url="" >
<siteMapNode title="ParentParentTest2" description="" url="~/ParentParentTest2.aspx" >
<siteMapNode title="ParentTest2" description="" url="~/ParentTest2.aspx" >
<siteMapNode title="Page_that_needs_to_be_in_multiple_Nodes" description="" url="~/XYZ.aspx" />
</siteMapNode>
</siteMapNode>
<siteMapNode title="ParentParentTest2" description="" url="~/ParentParentTest2.aspx" >
<siteMapNode title="ParentTest2" description="" url="~/ParentTest2.aspx">
////you don't have to add the ~/XYZ.aspx node again. If you add it then you will get a multiple node exception.
</siteMapNode>
</siteMapNode>
</siteMapNode>
//Copy this code in master page Page_Load event
SiteMap.SiteMapResolve += SiteMap_SiteMapResolve;
/// Добавить этот обработчик событий на главную страницу.
public SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
//get current node
SiteMapNode currentNode = SiteMap.CurrentNode;
if (currentNode != null)
{
currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode = currentNode;
SiteMapNode nNewNode = new SiteMapNode(e.Provider,tempNode.Key);
switch (tempNode.Key)
{
case "/Test1.aspx":
nNewNode.Clone(true);
nNewNode.ParentNode.ParentNode.ReadOnly = false;
nNewNode.ParentNode.ReadOnly = false;
if(QueryString["Page"]="Test1")
{
nNewNode.ParentNode.ParentNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/ParentParentTest1.aspx");
nNewNode.ParentNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/ParentTest1.aspx");
nNewNode.ParentNode.ReadOnly = false;
nNewNode.ParentNode.Url = "~/ParentTest1.aspx?StateSave=true";
nNewNode.ParentNode.Title = HttpContext.Current.Request.QueryString["ParentNodeName"];
nNewNode.Title = HttpContext.Current.Request.QueryString["CurrentNodeName"];
}
if (QueryString["Page"]="Test2")
{
//Copy the same code and replace Test1 with Test2.
}
// returning the newly prepared Node.
return nNewNode;
default: break;
}
}
}
return currentNode;
}