查询站点地图的字符串参数



我使用的是VWD 2010, ASP。净,c#。我有一个网站地图,工作,但我需要能够链接到外部网站和发送参数。我发现了一些代码,看起来应该工作,但我错过了某种理解,或者他们似乎假设我知道一些我不知道的东西。(另一个人似乎完全明白了。)

修订:添加以显示如何声明菜单和站点数据源。

            <asp:SiteMapDataSource runat="server" ID="siteMapDataSource" ShowStartingNode="false" />
            <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" DataSourceID="siteMapDataSource"
                EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
                BackColor="#F7F6F3" DynamicHorizontalOffset="2" Font-Names="Verdana" 
                Font-Size="0.8em" ForeColor="#7C6F57" StaticSubMenuIndent="10px">
                <DynamicHoverStyle BackColor="#7C6F57" ForeColor="White" />
                <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
                <DynamicMenuStyle BackColor="#F7F6F3" />
                <DynamicSelectedStyle BackColor="#5D7B9D" />
                <DynamicItemTemplate>
                    <%# Eval("Text") %>
                </DynamicItemTemplate>
                <StaticHoverStyle BackColor="#7C6F57" ForeColor="White" />
                <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
                <StaticSelectedStyle BackColor="#5D7B9D" />
            </asp:Menu>

请注意,菜单的工作范围是正确显示Web.sitemap中的数据。

这是原始代码的链接:http://weblogs.asp.net/jgaylord/adding-querystring-parameters-to-the-sitemapnode

我的sitemap工作,但它似乎没有调用这个扩展的sitemapprovider。我确信这个供应商不能满足我的需求……在这一点上,我只是试图确保它被调用。因此,我在Initialize()和SmartSiteMapProvider_SiteMapResolve()例程中的代码中设置了一些中断。我只是想让它在我认为应该调用的时候调用。如果我不能调试它,我就不能修改它;如果我不能调用它,我就不能调试它。

我使用c#代码,并在下面复制了它。我把它放在它自己的类文件在顶层叫做 extendedsitemapprovider。cs

这是来自网络的部分。

<siteMap enabled="true" defaultProvider="ExtendedSiteMapProvider">
  <providers>
    <clear/>
    <add name="ExtendedSiteMapProvider" type="Configuration.ExtendedSiteMapProvider" siteMapFile="web.sitemap" securityTrimmingEnabled="true" />
  </providers>
</siteMap>

该站点的c#代码。

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.SessionState;
namespace Configuration
{
    public class ExtendedSiteMapProvider : XmlSiteMapProvider
    {
        public override void Initialize(string name, NameValueCollection attributes)
        {
            base.Initialize(name, attributes);
            this.SiteMapResolve += SmartSiteMapProvider_SiteMapResolve;
        }
        static SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
        {
            if ((SiteMap.CurrentNode == null)) return null;
            SiteMapNode temp = SiteMap.CurrentNode.Clone(true);
            SiteMapNode tempNode = temp;

            while (tempNode != null)
            {
                string qs = GetQueryString(tempNode, e.Context);
                if (qs != null)
                {
                    tempNode.Url += qs;
                }
                tempNode = tempNode.ParentNode;
            }
            return temp;
        }
        private static string GetQueryString(SiteMapNode node, HttpContext context)
        {
            if (node["queryStringToInclude"] == null) return null;
            NameValueCollection values = new NameValueCollection();
            string[] vars = node["queryStringToInclude"].Split(",".ToCharArray());
            foreach (string s in vars)
            {
                string var = s.Trim();
                if (context.Request.QueryString[var] == null) continue;
                values.Add(var, context.Request.QueryString[var]);
            }
            if (values.Count == 0) return null;
            return NameValueCollectionToString(values);
        }
        private static string NameValueCollectionToString(NameValueCollection col)
        {
            string[] parts = new string[col.Count];
            string[] keys = col.AllKeys;
            for (int i = 0; i <= keys.Length - 1; i++)
            {
                parts[i] = keys[i] + "=" + col[keys[i]];
            }
            return "?" + string.Join("&", parts);
        }
    } 
}

看起来应该可以工作。在Page_Load中设置一个断点,当你击中它时,看看你的导航控件属性。例如,在"立即"窗口中输入"SiteMapPath1"。Provider属性将是XmlSiteMapProvider,或者,如果它工作,ExtendedSiteMapProvider

如果Page_Load中的断点也没有命中,那么这就是你的答案——你不知怎么地没有在调试模式下运行它。:)

相关内容

  • 没有找到相关文章

最新更新