从StaticSiteMapProvider导航到Sitemap

时间:2015-09-24 04:37:50

标签: c# asp.net sitemap sitemapprovider

我正在尝试动态构建ASP站点地图以提供给Google网站站长工具。我相信我已经完成并试图测试它...但我不能为我的生活找出如何导航到我的站点地图。的xD

我已经构建了一个扩展StaticSiteMapProvider并在我的网络配置中引用它的类。

[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]    
public class SiteMapConfig : StaticSiteMapProvider
{
    SiteMapNode _root;

    ArticleRepository _articles = new ArticleRepository();
    OpportunityRepository _opportunities = new OpportunityRepository();

    public override SiteMapNode BuildSiteMap()
    {
        lock (this)
        {
            var root = GetRootNodeCore();

            var newsNode = new SiteMapNode(this, "News", "~/News/", "News");
            this.AddNode(newsNode, root);

            foreach (var article in _articles.GetAll())
            {
                var encodedTitle = URLEncoding.MakeUserFriendlyURLValue(article.Title);
                var articleNode = new SiteMapNode(this, "Article:" + article.ID, "~/News/" + article.ID + "/" + encodedTitle + "/", article.Title);
                this.AddNode(articleNode, newsNode);
            }

            var gamesNode = new SiteMapNode(this, "Games", "~/Games/", "Games");
            this.AddNode(gamesNode, root);

            var aboutNode = new SiteMapNode(this, "About", "~/About/", "About");
            this.AddNode(aboutNode, root);

            var OpportunitiesNode = new SiteMapNode(this, "Opportunities", "~/Opportunities/", "Opportunities");
            this.AddNode(OpportunitiesNode, root);

            foreach (var opportunity in _opportunities.GetAll())
            {
                var encodedTitle = URLEncoding.MakeUserFriendlyURLValue(opportunity.Title);
                var opportunityNode = new SiteMapNode(this, "Opportunity:" + opportunity.ID, "~/Opportunity/" + opportunity.ID + "/" + encodedTitle + "/", opportunity.Title);
                this.AddNode(opportunityNode, OpportunitiesNode);
            }

        }

        return _root;
    }

    protected override SiteMapNode GetRootNodeCore()
    {
        if (_root == null)
        {
            _root = new SiteMapNode(this, "Home", "~/", "[REDACTED]");
            this.AddNode(_root);
        }

        return _root;
    }
}

Web.Config

  <system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />

<!-- TW: Added to configure site map -->
<siteMap enabled="true" defaultProvider="SiteMapConfig">
  <providers>
    <clear />
    <add name="SiteMapConfig" type="Daemon.Sites.Company.SiteMapConfig, Daemon.Sites.Company" />
  </providers>
</siteMap>

如何以xml格式查看?

在我的所有例子中都没有提到另一个步骤吗? (Example 1Example 2Example 3

我已尝试过:"~/Sitemap", "~/Web.sitemap", "~/sitemap.txt"

1 个答案:

答案 0 :(得分:0)

我能够通过从站点地图数据源引用它并将其绑定到树视图来测试我的站点地图提供程序。但是,这不是Google可接受的格式。

最终我决定废弃上面的代码并采用不同的方法来创建动态的站点地图xml:

SiteMap.aspx

<%@ Page ContentType="text/xml" Language="C#" AutoEventWireup="true" CodeBehind="SiteMap.aspx.cs" Inherits="Daemon.Sites.Company.SiteMap" %>

<!-- Cache this page for 1 day -->
<%@ OutputCache Duration="86400" VaryByParam="none" %>

<asp:repeater id="RepeaterSiteMap" runat="server">
    <HeaderTemplate>
        <?xml version="1.0" encoding="UTF-8"?>
        <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    </HeaderTemplate>
    <ItemTemplate>
        <url>
            <loc><%# DataBinder.Eval(Container.DataItem, "Location") %></loc>
            <priority><%# DataBinder.Eval(Container.DataItem, "Priority") %></priority>
        </url>
    </ItemTemplate>
    <FooterTemplate>
        </urlset> 
    </FooterTemplate>
</asp:repeater>

SiteMap.aspx.cs

public partial class SiteMap : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<SiteMapEntry> entries = new List<SiteMapEntry>();

        entries.Add(new SiteMapEntry()
        {
            Location = "http://www.[redacted].com/",
            Priority = 1.0
        });

        entries.Add(new SiteMapEntry()
        {
            Location = "http://www.[redacted].com/About/",
            Priority = 0.9
        });

        entries.Add(new SiteMapEntry()
        {
            Location = "http://www.[redacted].com/Games/",
            Priority = 0.8
        });

        entries.Add(new SiteMapEntry()
        {
            Location = "http://www.[redacted].com/Opportunities/",
            Priority = 0.7
        });

        using (var opportunities = new OpportunityRepository())
        {
            foreach (var opportunity in opportunities.GetAll())
            {
                var encodedTitle = URLEncoding.MakeUserFriendlyURLValue(opportunity.Title);
                entries.Add(new SiteMapEntry()
                {
                    Location = "http://www.[redacted].com/Opportunity/" + opportunity.ID + "/" + encodedTitle + "/",
                    Priority = 0.6
                });
            }
        }

        entries.Add(new SiteMapEntry()
        {
            Location = "http://www.[redacted].com/News/",
            Priority = 0.5
        });

        using (var articles = new ArticleRepository())
        {
            foreach (var article in articles.GetAll())
            {
                var encodedTitle = URLEncoding.MakeUserFriendlyURLValue(article.Title);
                entries.Add(new SiteMapEntry()
                {
                    Location = "http://www.[redacted].com/News/" + article.ID + "/" + encodedTitle + "/",
                    Priority = 0.4
                });
            }
        }

        this.RepeaterSiteMap.DataSource = entries;
        this.RepeaterSiteMap.DataBind();
    }
}

public class SiteMapEntry
{
    public string Location { get; set; }
    public double Priority { get; set; }
}