【问题标题】:How do I get MVCSiteMap to include all my custom generated pages in the sitemap.xml如何让 MVCSiteMap 将所有自定义生成的页面包含在 sitemap.xml 中
【发布时间】:2014-03-07 16:50:52
【问题描述】:

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

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

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

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)。它呈现了这个:

  • 首页
  • 关于
  • 招聘解决方案
  • 隐私政策
  • 条款
  • 搜索
    • 工作

我怎样才能让它动态地做到这一点?:

  • 首页
  • 关于
  • 招聘解决方案
  • 隐私政策
  • 条款
  • 搜索
    • 工作
      • /JobSearch/chief-talent-officer-1710
      • /JobSearch/another-one-1234
      • /JobSearch/another-one-1235
      • /JobSearch/another-one-1236
      • /JobSearch/another-one-1237

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

【问题讨论】:

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


    【解决方案1】:

    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;
                }
            }
        } 
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 实际上,这并不是 MvcSiteMapProvider 所做的。使用 IDynamicNodeProvider(或 ISiteMapNodeProvider),您可以指定自定义路由值,以便从动态数据驱动的所有 URL 都包含在 sitemap.xml 中。唯一需要做的就是在 MVC 中配置路由以获取所需的 URL。
      猜你喜欢
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多