【问题标题】:MVCSitemapProvider Issue with custom Route自定义路由的 MVSitemapProvider 问题
【发布时间】:2014-10-15 04:58:25
【问题描述】:

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

当我使用 route=Blog 时,我的路由映射到此 URL:&lt;loc&gt;http://localhost:7872/#&lt;/loc&gt;

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

该 URL 工作正常,但我正在尝试改进 SEO,并且站点地图非常必要 我不确定如何设置。有什么想法吗?

【问题讨论】:

    标签: c# asp.net-mvc mvcsitemapprovider asp.net-mvc-sitemap


    【解决方案1】:

    您应该使用a dynamic node provider 将每篇博文设为一个单独的节点。您还需要向 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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多