0

我很难使用 MVCSitemapProvider 生成站点地图,我的情况是:

我有这个 :

 routes.MapRoute("Blog", "Blog/{id}/{seoName}", new { controller = "Blog", action = "ViewBlog", seoName = "" }, new { id = @"^\d+$" });

我将其用作我的控制器的属性

            [MvcSiteMapNode(Title = "Blog", Key = "ViewBlog", ParentKey = "Blog",Route="Blog")]

问题是 sitemap.xml 包含以下内容:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://localhost:7872/</loc>
</url>
<url>
<loc>http://localhost:7872/#</loc>
</url>
<url>
<loc>http://localhost:7872/Blog</loc>
</url>
<url>
<loc>http://localhost:7872/Home/About</loc>
</url>
</urlset>

我的路线映射到这个 URL: <loc>http://localhost:7872/#</loc>当我使用 route=Blog

它应该是这样的:localhost:7872/blog/idhere/friendurlName

该 URL 工作正常,但我正在尝试改进 SEO 和站点地图是非常必要的,我不知道如何设置它。有任何想法吗?

4

1 回答 1

1

您应该使用动态节点提供程序将每篇博文变成一个单独的节点。您还需要向 MvcSiteMapProvider 注册“id”和“seoName”路由参数,否则它将无法匹配路由或构建正确的 URL。

[MvcSiteMapNode(DynamicNodeProvider = "MyNamespace.BlogDynamicNodeProvider, MyAssembly", Route = "Blog")]
public ActionResult ViewBlog(int id, string seoName)
{
    // Retrieve your blog post here...

    return View();
}

在您项目的代码文件中...

public class BlogDynamicNodeProvider : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        // BlogEntities would be your entity framework context class
        // or repository.
        using (var entities = new BlogEntities())
        {
            // Create a node for each blog post
            foreach (var blogPost in entities.BlogPosts)
            {
                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Title = blogPost.Title;
                dynamicNode.ParentKey = "Blog";
                dynamicNode.Key = "BlogPost_" + blogPost.Id;
                dynamicNode.RouteValues.Add("id", blogPost.Id);
                dynamicNode.RouteValues.Add("seoName", blogPost.SeoName);

                yield return dynamicNode;
            }
        }
    }
}
于 2014-10-15T16:46:57.707 回答