Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MvcSiteMapProvider 4实现图像站点地图_C#_Asp.net Mvc_Seo_Mvcsitemapprovider - Fatal编程技术网

C# 使用MvcSiteMapProvider 4实现图像站点地图

C# 使用MvcSiteMapProvider 4实现图像站点地图,c#,asp.net-mvc,seo,mvcsitemapprovider,C#,Asp.net Mvc,Seo,Mvcsitemapprovider,我使用MvcSiteMapProvider为我们的站点实现动态站点地图。该网站有一个不断更新的文章集,每一篇文章都表示为一个不同的页面。因此,我们使用MvcSiteMapProvider来动态生成sitemap.xml。然而,问题是我们已经在文章中添加了图像,我们希望将这些图像添加到sitemap.xml,以便它们也可以被索引 我需要实现的是生成一个类似于为站点地图添加图像URL所述的结构,即: <?xml version="1.0" encoding="UTF-8"?> <

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

我需要实现的是生成一个类似于为站点地图添加图像URL所述的结构,即:

<?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> 

http://example.com/sample.html
http://example.com/image.jpg
http://example.com/photo.jpg
目前我的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;
    }
}
public override IEnumerable GetDynamicNodeCollection(ISiteMapNode节点)
{
列表项目=新列表();
使用(siteMapHelperDB=new siteMapHelperDB())
{
articles=db.GetArticleSiteMapNodes();
}
foreach(文章中的文章项)
{
var dynamicNode=新的dynamicNode();
dynamicNode.Title=item.urlName;//URL友好的标题
Add(“id”,string.Format(“{0}/{1}”,item.id,item.urlName));
收益动态模型;
}
}
我的Mvc.Sitemap说明如下:

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

到目前为止,所有这些都非常有效。我现在需要了解的是,如何为每篇文章添加
节点

MvcSiteMapProvider 4当前支持这一点吗?如果是,我需要做什么来实现它


谢谢

目前不支持开箱即用。即使如此,它也从未完成过,并且作为一项新功能,它已经在待办事项列表中。但是,由于这是开源的,所以只要有人来做,它就会完成:)

因此,您有两种选择:

  • 将其作为一流功能构建到MvcSiteMapProvider中,并通过pull请求将其作为贡献提交
  • 使用属性字典扩展MvcSiteMapProvider,将每个节点的子图像集合存储为仅适用于应用程序的二级功能
  • 对于第一种选择,我们希望能够支持谷歌所发明的一切。因此,即使您现在决定实现图像站点地图,设计也应该考虑可扩展性

    所涉及的步骤包括:

  • 读这本书
  • 创建一个包含每个子对象所需的所有属性的接口(如果只是处理图像,您只需要一个属性,但是我们应该有一个接口而不是字符串,以防Google扩展它)。我们正在使用DI,因此重要的是接口是传递的内容,而不是具体类型
  • 为每个接口创建相应的对象。它们必须使用完全相同的名称(不包括“I”),以便在外部DI配置中自动连接
  • 创建接受在步骤2中创建的接口的词典和/或集合。使用中的选项作为指导
  • 请记住,站点地图是在所有用户之间共享的,因此当SiteMap.IsReadOnly属性为true时,必须将对象设置为只读(有关示例,请参阅集合和LockableSiteMapNode)
  • 更新XmlSiteMapResult类以读取新集合并生成适当的XML。由于这是一种不太可能更改的标准格式,因此对XML声明进行硬编码是可以的
  • 决定要使用哪种方法填充节点(IsItemaNodeProvider、IDynamicNodeProvider、XML或.NET属性),并更新相应的IsItemaNodeProvider实现,以便填充新的子集合/字典。IsItemaNodeProvider是您最简单的选择-在这种情况下,您只需在应用程序中构建您的实现即可。如果您决定使用XML,我认为最好使用与Google用作
    子节点的格式完全相同的格式,这样就可以从另一个XML文档复制和粘贴它。您需要更新XSD文件,以便它能够适当地验证XML
  • 实现图像URL的源代码。理想情况下,我们希望所有来源都支持这一点,但会接受一个或两个来源。iItemaNodeProvider在任何情况下都需要支持它。每个子集合/字典的实例化方式应与当前子集合/字典的实例化方式相同,方法是在创建SiteMapNode时使用抽象工厂创建它
  • 如需任何其他问题/反馈,请使用@GitHub。这可能需要一点回溯和第四次沟通才能实现,最好在那里完成

    对于第二种选择:

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

  • 谢谢我会努力使它为我们的网站工作,如果它工作正常,我会尝试创建一个适当的贡献包。仅供参考-我正在工作