如何让MVCSiteMap在sitemap.xml中包含我自己生成的所有页面

时间:2014-03-07 16:50:53

标签: asp.net asp.net-mvc asp.net-mvc-5 mvcsitemapprovider

我已经梳理了文档,但我找不到我要找的东西。我可能正在寻找的是不可能的,这对我来说是一个新的领域。

我第一次使用MVCSiteMapProvider。我需要确保搜索引擎可以在我的asp.net mvc站点中抓取动态创建的页面列表。

视图基于两个参数创建:title和id。吐出的网址在自定义路由中定义,如下所示:

routes.MapRoute(
      "JobResults",                                           // Route name
      "JobSearch/{title}-{id}",                            // URL with parameters
        new { controller = "JobSearch", action = "Job" },  // Parameter defaults
        new[] { "MyApp.Web.Controllers" }
        );

所以当我点击一个链接时,它会带我去:localhost:43736 / JobSearch / chief-talent-officer-1710

我设置了站点地图插件并与.sitemap文件混淆,所以它看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
    <mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
        xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

      <mvcSiteMapNode title="Home" controller="Home" action="Index" changeFrequency="Always" updatePriority="Normal">
        <mvcSiteMapNode title="About" controller="Home" action="About"/>
        <mvcSiteMapNode title="HiringSolutions" controller="Home" action="HiringSolutions"/>
        <mvcSiteMapNode title="Privacy Policy" controller="Home" action="Privacy"/>
        <mvcSiteMapNode title="Terms" controller="Home" action="Terms" />
        <mvcSiteMapNode title="Search" controller="JobSearch" action="Index"  changeFrequency="Always" updatePriority="Normal">
          <mvcSiteMapNode title="Job" controller="JobSearch" action="Job" changeFrequency="Always" updatePriority="High" route="JobResults"/>
        </mvcSiteMapNode>
      </mvcSiteMapNode>
</mvcSiteMap>

要查看它的内容,我在索引页面上调用了它:@Html.MvcSiteMap().Menu(false, true, true)。它提出了这个:

  • 主页
  • 关于
  • HiringSolutions
  • 隐私政策
  • 条款
  • 搜索
    • 工作

我怎样才能让它动态地执行此操作?:

  • 主页
  • 关于
  • HiringSolutions
  • 隐私政策
  • 条款
  • 搜索
    • 作业
      • /职位搜索/首席-人才官-1710
      • /职位搜索/另一个酮-1234
      • /职位搜索/另一个酮1235
      • /职位搜索/另一个酮1236
      • /职位搜索/另一个酮1237

一旦我有了(如果可能的话),这会在我网站的根目录中创建一个sitemap.xml文件,还是我需要做些什么来让机器人可以访问?

2 个答案:

答案 0 :(得分:2)

DynamicNodeProvider听起来像你在找什么?示例代码显示了如何从数据库查询构建一组节点。

public class StoreDetailsDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var storeDB = new MusicStoreEntities())
        {
            // Create a node for each album 
            foreach (var album in storeDB.Albums.Include("Genre")) 
            { 
                DynamicNode dynamicNode = new DynamicNode(); 
                dynamicNode.Title = album.Title; 
                dynamicNode.ParentKey = "Genre_" + album.Genre.Name; 
                dynamicNode.RouteValues.Add("id", album.AlbumId);

                yield return dynamicNode;
            }
        }
    } 
}

答案 1 :(得分:1)

听起来您需要创建一个手册页,其中列出了数据库中的所有作业,因为站点地图提供者(或Google)不太可能知道将什么作为参数添加到作业或搜索页面。

或者创建一个为您生成sitemap.xml的脚本。在任何一种情况下,这都是必须要做的工作,因为只有你知道数据的结构。