自定义路由的MVCSitemapProvider问题

本文关键字:问题 MVCSitemapProvider 路由 自定义 | 更新日期: 2023-09-27 18:26:29

我很难使用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>

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

URL运行良好,但我正在努力改进SEO和Sitemap是非常必要的我不知道该怎么设置。有什么想法吗?

自定义路由的MVCSitemapProvider问题

您应该使用一个动态节点提供程序将每个博客文章制作成一个单独的节点。您还需要向MvcSiteMapProvider注册"id"answers"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;
            }
        }
    }
}