Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 网站地图的查询字符串参数_Asp.net_Sitemap_Querystringparameter_Sitemapprovider - Fatal编程技术网

Asp.net 网站地图的查询字符串参数

Asp.net 网站地图的查询字符串参数,asp.net,sitemap,querystringparameter,sitemapprovider,Asp.net,Sitemap,Querystringparameter,Sitemapprovider,我正在使用VWD2010、ASP.Net、C#。我有一个网站地图,工作,但我需要能够链接到外部网站和发送参数。我找到了一些看起来应该可以工作的代码,但我缺少某种理解,或者他们似乎认为我知道一些我不知道的东西。(另一个人似乎已经完全明白了。) 修订: 添加以显示如何声明菜单和sitedatasource <asp:SiteMapDataSource runat="server" ID="siteMapDataSource" ShowStartingNode="fals

我正在使用VWD2010、ASP.Net、C#。我有一个网站地图,工作,但我需要能够链接到外部网站和发送参数。我找到了一些看起来应该可以工作的代码,但我缺少某种理解,或者他们似乎认为我知道一些我不知道的东西。(另一个人似乎已经完全明白了。)

修订: 添加以显示如何声明菜单和sitedatasource

            <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>

我的站点地图可以工作,但它似乎没有调用此扩展的站点地图提供程序。我确信这个提供者并没有做我需要的事情…在这一点上,我只是想确保它被调用。因此,我在Initialize()和SmartSiteMapProvider\u 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);
        }
    } 
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.Specialized;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Web.UI.WebControl.WebParts;
使用System.Web.SessionState;
命名空间配置
{
公共类ExtendedSiteMapProvider:XmlSiteMapProvider
{
公共覆盖无效初始化(字符串名称、NameValueCollection属性)
{
初始化(名称、属性);
this.sitemaprolve+=SmartSiteMapProvider\u SiteMapResolve;
}
静态SiteMapNode SmartSiteMapProvider\u SiteMapResolve(对象发送方,SiteMapResolveEventArgs e)
{
if((SiteMap.CurrentNode==null))返回null;
SiteMapNode temp=SiteMap.CurrentNode.Clone(true);
SiteMapNode tempNode=temp;
while(tempNode!=null)
{
字符串qs=GetQueryString(tempNode,e.Context);
如果(qs!=null)
{
tempNode.Url+=qs;
}
tempNode=tempNode.ParentNode;
}
返回温度;
}
私有静态字符串GetQueryString(SiteMapNode节点,HttpContext上下文)
{
if(node[“queryStringToInclude”]==null)返回null;
NameValueCollection values=新的NameValueCollection();
字符串[]vars=node[“queryStringToInclude”].Split(“,”.ToCharArray());
foreach(变量中的字符串s)
{
字符串var=s.Trim();
如果(context.Request.QueryString[var]==null)继续;
Add(var,context.Request.QueryString[var]);
}
if(values.Count==0)返回null;
返回NameValueCollectionToString(值);
}
私有静态字符串NameValueCollectionToString(NameValueCollection列)
{
字符串[]部分=新字符串[col.Count];
string[]keys=col.AllKeys;

对于(int i=0;i它看起来应该可以工作。在
Page_Load
中设置一个断点,点击时,查看导航控件属性。例如,在即时窗口中输入
SiteMapPath1
Provider
属性将是
XmlSiteMapProvider
,或者,如果它正在工作,
ExtendedSiteMapProvider


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

我这样做了。调试器说当前上下文中不存在SiteMapPath1和提供程序。有一个SiteMapPath,但它似乎没有我要找的内容。与SiteMap一起使用的导航是什么?例如,您的页面是否包含名为SiteMapPath1的
SiteMapPath
控件?(如果没有,添加一个时会发生什么?)我搜索了该项目。整个项目中没有名为SiteMapPath或SiteMapPath1的对象(因此我不理解调试器如何看到SiteMapPath的值,除非系统自己构建它).我应该从你的评论中推断我应该创建这样一个对象吗?我正在重新阅读源页面…没有说任何关于它的内容…也许他认为读者已经知道了这一点。另外,如果我必须在页面上包括这一点,我必须在每个页面上都这样做吗?或者我可以从Global.asax.cs中的应用程序启动调用它吗?(很抱歉,如果我有问题的话……我只是在想我该怎么做。)ASP.NET站点地图通常与一个或另一个站点地图一起使用。我想您的页面上可能已经有了一个站点地图,或者可能希望通过实验添加一个。在回答您的另一个问题时,不需要为每个页面添加导航控件,您可以将其放入母版页中,正如我刚才链接到的页面所述。