Запрос параметров строки для карты сайта

Я использую 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

Моя карта сайта работает, но, похоже, она не вызывает этот расширенный поставщик сайта. Я уверен, что этот провайдер не делает то, что мне нужно... на данный момент я просто пытаюсь убедиться, что он вызывается. Итак, я установил некоторые перерывы в коде в 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);
        }
    } 
}

1 ответ

Решение

Похоже, это должно работать. Установить точку останова в Page_Loadи, когда вы нажмете его, взгляните на свойства вашего элемента управления навигацией. Например, введите SiteMapPath1 в ближайшее окно. Provider собственность будет либо XmlSiteMapProviderили, если это работает, ExtendedSiteMapProvider,

Если точка останова в Page_Load тоже не попал, тогда это ваш ответ - вы как-то не запускаете его в режиме отладки.:)

Другие вопросы по тегам