【问题标题】:Implement Image Sitemap using MvcSiteMapProvider 4使用 MvcSiteMapProvider 4 实现图像站点地图
【发布时间】:2014-02-08 10:17:09
【问题描述】:

我使用 MvcSiteMapProvider 来为我们的站点实现动态站点地图。该站点拥有不断更新的文章集,每篇文章都表示为不同的页面。因此,我们使用 MvcSiteMapProvider 来动态生成 sitemap.xml。然而,问题是我们已将图像添加到文章中,我们希望将其添加到 sitemap.xml 以便它们也可以被索引。

我需要实现的是生成一个类似于将图像网址添加到站点地图的结构,即:

<?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
 <url>
   <loc>http://example.com/sample.html</loc>
   <image:image>
     <image:loc>http://example.com/image.jpg</image:loc>
   </image:image>
   <image:image>
     <image:loc>http://example.com/photo.jpg</image:loc>
   </image:image>
 </url> 
</urlset> 

目前我的DynamicNode生成代码是这样的

public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
    List<Article> articles = new List<Article>();
    using(siteMapHelperDB db = new siteMapHelperDB())
    {
        articles = db.GetArticleSiteMapNodes();
    }
    foreach(Article item in articles)
    {
        var dynamicNode = new DynamicNode();
        dynamicNode.Title = item.urlName; // URL Friendly title
        dynamicNode.RouteValues.Add("id", string.Format("{0}/{1}", item.ID, item.urlName));

        yield return dynamicNode;
    }
}

我的 Mvc.Sitemap 描述是这样的:

<mvcSiteMapNode title="Articles" controller="Articles" action="Show"
                dynamicNodeProvider="ArticlesKB.ArticlesNodeProvider, ArticlesKB"/>

到目前为止,这一切都很好。我现在需要弄清楚,我如何在每篇文章中实际添加 &lt;image:image&gt; 节点。

目前在 MvcSiteMapProvider 4 中是否支持?如果是,我需要做什么来实现它?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    目前不支持开箱即用。 1 other person has requested it 甚至 made a first draft 但它从未完成,它在待办事项列表中作为新功能添加。但是,既然这是开源的,那么当有人开始使用它时它就会完成:)。

    所以,你有两个选择:

    1. 将此作为一流功能构建到 MvcSiteMapProvider 中,并通过拉取请求将其作为贡献提交。
    2. 使用 Attributes 字典扩展 MvcSiteMapProvider 以将每个节点的子图像集合存储为仅适用于您的应用程序的第二类功能。

    对于第一个选项,我们希望支持 Google 发明的所有 various types of sitemaps。因此,即使您现在只决定实现图像站点地图,设计也应考虑可扩展性。

    涉及的步骤是:

    1. 阅读contribution guide。
    2. 使用每个子对象所需的所有属性创建一个接口(如果只是制作图像,您只需要一个属性,但我们应该有一个接口而不是字符串,以防 Google 扩展它)。我们使用的是 DI,所以重要的是接口是传递的,而不是具体的类型。
    3. 为每个接口创建相应的对象。它们必须使用完全相同的名称(不包括“I”),以便在外部 DI 配置中自动连接。
    4. 创建接受您在第 2 步中创建的接口的字典和/或集合。使用MvcSiteMapProvider.Collections.Specialized namespace 中的接口作为指导。
    5. 请记住,SiteMap 在所有用户之间共享,因此当 SiteMap.IsReadOnly 属性为 true 时,必须将对象设置为只读(有关示例,请参见集合和 LockableSiteMapNode)。
    6. 更新 XmlSiteMapResult 类以读取新集合并生成适当的 XML。由于这是一种不太可能改变的标准化格式,因此可以对 XML 声明进行硬编码。
    7. 决定要使用哪种方法来填充节点(ISiteMapNodeProvider、IDynamicNodeProvider、XML 或 .NET 属性)并更新相应的 ISiteMapNodeProvider 实现,以便填充新的子集合/字典。 ISiteMapNodeProvider 是您最简单的选择 - 在这种情况下,您只需在应用程序中构建您的实现即可。如果您决定使用 XML,我认为最好使用与 Google 用作&lt;mvcSiteMapNode/&gt; 子节点的完全相同的格式,这样它就有可能从另一个 XML 文档中复制和粘贴。您需要更新 XSD 文件,以便它可以适当地验证 XML。
    8. 实现图像 URL 的来源。理想情况下,我们希望所有来源都支持这一点,但会接受一两个来源。 ISiteMapNodeProvider 在任何情况下都需要支持它。每个子集合/字典都应该以与当前子集合/字典相同的方式实例化,方法是在创建 SiteMapNode 时使用抽象工厂来创建它。

    如有任何其他问题/反馈,请使用open issue@GitHub。这可能需要一些回传和第四次通信才能实现,最好在那里完成。

    对于第二个选项:

    1. 使用其中一个节点源来提供自定义属性的子字典(请注意,.NET 属性目前已被破坏 - 补丁将在 v4.5 中)。将它们添加到属性字典 node.Attributes.Add("sitemaps-images", imageCollection)。
    2. 将 XmlSiteMapResult 复制到您的项目并对其进行更新,以便在“sitemaps-images”字典有条目时写入适当的 XML。目前没有办法注入替代实现。
    3. 构建一个自定义控制器来为 /sitemaps.xml 端点提供服务,并以与内置 XmlSiteMapController 相同的方式使用 XmlSiteMapResult。
    4. 禁用内置控制器:对于内部 DI,在 web.config 中将 appSettings "MvcSiteMapProvider_EnableSitemapsXml" 值设置为 "false"。对于外部 DI,请从 App_Start\MvcSiteMapProviderConfig.cs 文件中删除 XmlSiteMapController.RegisterRoutes(RouteTable.Routes); 行。
    5. 以与在 XmlSiteMapController 中类似的方式注册您的路线。

    【讨论】:

    • 谢谢!我会努力让它为我们的网站工作,如果它工作正常,我会尝试创建一个合适的贡献包。
    • 仅供参考 - 我正在开发 v4.5,如果您在 v4.5 分支上工作(在这种情况下的贡献),那将是最好的,因为对XmlSiteMapNodeProvider 和 ReflectionSiteMapNodeProvider 实现(特别是如何填充集合和字典)。 github.com/NightOwl888/MvcSiteMapProvider/tree/v4.5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多