【问题标题】:Query string paramaters for a sitemap查询站点地图的字符串参数
【发布时间】:2014-06-26 18:26:11
【问题描述】:

我正在使用 VWD 2010、ASP.Net、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

我的站点地图有效,但它似乎没有调用这个扩展的sitemapprovider。我确信这个提供者没有做我需要的事情......在这一点上,我只是想确保它被调用。因此,我在 Initialize() 和 SmartSiteMapProvider_SiteMapResolve() 例程中的代码中设置了一些中断。我只是想在我认为此时应该调用它时调用它。不能调试就不能修改,不能调用就不能调试。

我为此使用了 C# 代码,并在下面复制了它。我已将它放在名为 ExtendedSiteMapProvider.cs

的顶层自己的类文件中

这是我正在使用的 web.config 中的部分。

<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);
        }
    } 
}

【问题讨论】:

    标签: asp.net sitemap querystringparameter sitemapprovider


    【解决方案1】:

    看起来它应该可以工作。在Page_Load 中设置断点,当您点击它时,查看您的导航控件属性。例如,在“立即”窗口中输入 SiteMapPath1Provider 属性将是 XmlSiteMapProvider,或者,如果它正在工作,则为 ExtendedSiteMapProvider

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

    【讨论】:

    • 我这样做了。调试器说 SiteMapPath1 和 Provider 在当前上下文中不存在。有一个 SiteMapPath,但它似乎没有我要找的东西。
    • 您将什么导航与您的站点地图结合使用?例如,您的页面是否包含名为 SiteMapPath1 的 SiteMapPath 控件? (如果没有,当你添加一个时会发生什么?)
    • 我搜索了这个项目。整个项目中没有名为 SiteMapPath 或 SiteMapPath1 的对象(所以我不明白调试器如何看到 SiteMapPath 的值,除非系统自己构建它)。我应该从您的评论中推断出我应该创建这样一个对象吗?我正在重读源页面......没有说任何关于它的内容......也许他假设读者已经知道这一点。
    • 另外,如果我必须在页面上包含这个,我必须在每个页面上都这样做还是可以从 Global.asax.cs 中的 Application_Start 调用它? (对不起,如果我走神了……只是想通过这件事应该如何工作。)
    • ASP.NET SiteMap 通常与Site navigation controls 中的一个或另一个结合使用。我在想象你的页面上可能已经有一个,或者可能想通过实验添加一个。在回答您的另一个问题时,不,您不需要为每个页面添加导航控件,您可以将其放在母版页中,如我刚刚链接到的页面所述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多