, . SiteMap.SiteMapResolve Global.asax, URL- SiteMapProvider.FindSiteMapNode URL:
private void Application_Start(object sender, EventArgs e)
{
SiteMap.SiteMapResolve += ResolveCustomNodes;
}
private SiteMapNode ResolveCustomNodes(object sender, SiteMapResolveEventArgs e)
{
if (e.Context.Request.AppRelativeCurrentExecutionFilePath.Equals(
"~/Image.aspx", StringComparison.OrdinalIgnoreCase)
|| e.Context.Request.AppRelativeCurrentExecutionFilePath.Equals(
"~/Headline.aspx", StringComparison.OrdinalIgnoreCase))
{
string location = context.Request.QueryString["location"];
if (location != null)
return e.Provider.FindSiteMapNode(
e.Context.Request.AppRelativeCurrentExecutionFilePath
"?location=" + HttpUtility.UrlEncode(location));
}
return null;
}
SiteMapProvider s, .
, , , ( ):
<siteMapNode> , . , sitemap ( , ). -
<siteMapNode url="~/Image.aspx?location=Our Products"
queryStringField="location"
title="Our Products" description="Our Products" />
, node, queryStringField:
private IEnumerable<SiteMapNode> FindNodesWithQueryString(SiteMapNode node)
{
if (node["queryStringField"] != null)
yield return node;
foreach (SiteMapNode childNode in node.ChildNodes)
{
foreach (SiteMapNode matchingNode in FindNodesWithQueryString(childNode))
{
yield return matchingNode;
}
}
}
. , , , , SiteMapResolve , . SiteMapProvider s.
private SiteMapNode ResolveCustomNodes(object sender, SiteMapResolveEventArgs e)
{
string path = e.Context.Request.AppRelativeCurrentExecutionFilePath;
foreach (var candidate in from node in FindNodesWithQueryString(
SiteMap.RootNode)
select new {
Url = node.Url,
UrlNoQuery = node.Url.Split('?')[0],
QueryStringField = node["queryStringField"],
Node = node
} into x
where path.Equals(x.UrlNoQuery,
StringComparison.OrdinalIgnoreCase)
select x)
{
string paramValue = context.Request.QueryString[
candidate.QueryStringField];
if (paramValue != null)
{
string url = candidate.UrlNoQuery + "?" + candidate.QueryStringField
+ "=" + HttpUtility.UrlEncode(paramValue);
if (url.Equals(candidate.Url, StringComparison.OrdinalIgnoreCase))
return candidate.Node;
}
}
return null;
}