当前位置: 首页 > 编程语言 > C#

SiteMap导航和查询字符串分享

时间:2023-04-10 12:42:57 C#

SiteMap导航和查询字符串我目前正在尝试弄清楚如何将动态查询字符串参数添加到我的站点地图导航菜单中。例如,用户选择他想使用的来源和版本。我有一个创建导航链接的简单站点地图,但用户选择的参数需要在查询字符串中传递。默认地图如下所示:链接现在需要根据用户的选择动态添加参数。示例:希望这是相当清楚的。如果有人需要更深入的解释,请告诉我。谢谢不幸的是,默认情况下不支持此功能。但是您可以在Global.asax中实现SiteMap.SiteMapResolve事件以捕获此类扩展的url并使用正确的url调用SiteMapProvider.FindSiteMapNode:}privateSiteMapNodeResolveCustomNodes(objectsender,SiteMapResolveEventArgse){//捕获~/Image.aspx和~/Headline.aspxif(e.Context.Request.AppRelativeCurrentExecutionFilePath.Equals("~/Image.aspx",StringComparison.OrdinalIgnoreCase)||e.Context.Request.AppRelativeCurrentExecutionFilePath.Equals("~/Headline.aspx",StringComparison.OrdinalIgnoreCase)){stringlocation=context.Request.QueryString["location"];if(location!=null)//忽略除location=之外的所有内容}返回空值;//使用默认实现;无需自定义SiteMapProvider,这适用于任何提供商。现在,如果你想变得更加动态,你可以做几件事,例如(可能):用匹配特殊属性的查询字符串的一部分标记所有标签,并通过迭代整个站点地图来加载这个列表。这种方法的问题是它对于某些站点地图提供者来说效率很低(基于文件的提供者是很好地匹配这种方法的提供者的一个例子)。然后你所要做的就是说在代码中你可以通过从根节点开始并使用queryStringField属性记住所有节点来递归地找到这样的节点:privateIEnumerableFindNodesWithQueryString(SiteMapNodenode){if(node["queryStringField"]!=null)yield返回节点;foreach(SiteMapNodechildNodeinnode.ChildNodes){foreach(SiteMapNodematchingNodeinFindNodesWithQueryString(childNode)){yieldreturnmatchingNode;}}}有了这个列表,一些挥手,你应该可以做同样的事情。请注意,您可能需要缓存此列表,因为调用SiteMapResolve事件的频率可能比您预期的要高。尤其是对于数据库类型的SiteMapProvider。privateSiteMapNodeResolveCustomNodes(objectsender,SiteMapResolveEventArgse){stringpath=e.Context.Request.AppRelativeCurrentExecutionFilePath;foreach(varcandidateinfromnodeinFindNodesWithQueryString(SiteMap.RootNode)selectnew{Url=node.Url,=UrlNoQuer.Split('?')[0],QueryStringField=node["queryStringField"],Node=node}进入x其中path.Equals(x.UrlNoQuery,StringComparison.OrdinalIgnoreCase)选择x){stringparamValue=context.Request.QueryString[candidate.QueryStringField];if(paramValue!=null){stringurl=candidate.UrlNoQuery+"?"+candidate.QueryStringField+"="+HttpUtility.UrlEncode(paramValue);如果(url.Equals(candidate.Url,StringComparison.OrdinalIgnoreCase))返回candidate.Node;}}返回空值;}ASP.NET中的默认SiteMap提供程序不允许查询字符串。这是很多人遇到的问题-编写自己的提供程序很容易,但它具有查询字符串功能。以下供应商已为我工作多年。http://www.csharper.net/blog/custom_sitemapprovider_incorporates_querystring_reliance.aspx我遇到了与使用base64、url编码字符串作为站点地图中的查询参数相关的类似问题。最简单的解决方案是只处理MenuItemDataBound事件并在那里进行编码:string[]url=e.Item.NavigateUrl.Split('?');如果(url.Length==2){url[1]=WebUtils.encodeString(url[1]);}e.Item.NavigateUrl=string.Join("?",url);我的webutils方法:以上就是C#学习教程的全部内容:SiteMap导航和查询字符串分享,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——publicstaticstringencodeString(字符串值){returnHttpUtility.UrlEncode(Convert.ToBase64String(Encoding.UTF8.GetBytes(value)));}publicstaticstringdecodeString(stringvalue){returnEncoding.UTF8.GetString(Convert.FromBase64String(HttpUtility.UrlDecode(value)));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: