我很难使用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
时,我的路线正在映射到此网址:<loc>http://localhost:7872/#</loc>
应该是这样的:localhost:7872/blog/idhere/friendurlName
网址工作正常,但我正在努力改善搜索引擎优化和Sitemap是非常必要的 我不知道如何设置它。任何想法?
答案 0 :(得分: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;
}
}
}
}