2012-12-27 32 views
0

我一直在为此奋斗了几天。找不到任何好的例子,或者我理解的例子。动态网站地图,数据库驱动

背景: 我拥有一个用户博客的小博客平台。 每个用户都有自己的子域名,目前没有可用的站点地图。不好。 我想创建一些动态站点地图,其中所有sitemapnodes都从数据库中检索。该网站地图将仅用于搜索引擎蜘蛛。 系统:ASP.NET,mySQL。

该站点地图是纯XML。所以我需要以某种方式创建一个返回xml-data而不是html的ASPX文件。 我需要以某种方式将web.sitemap重定向到该动态文件。

我从来没有使用过XML,我不知道如何创建一个创建XML数据的文件。所以我甚至不知道要搜索什么。 我不希望任何静态站点地图文件存储在服务器上。一切都应该即时创建。

所以。请。如果你可以给我一些关于XML的建议,在互联网上的任何例子,或者只是搜索什么。

我的主要问题:

1. 如何创建aspx文件的XML输出?

2. 如何“通知”系统,和搜索引擎抓取工具抓取的文件是“/sitemap.aspx”

的感谢!

+1

我相信下面的文章将帮助你[ http://www.codeproject.com/Articles/16860/Building-a-dynamic-SiteMap-in-ASP-NET-2-0-for-a-la](http://www.codeproject.com/Articles/16860/Building-a-dynamic-SiteMap-in-ASP-NET-2-0-a-la) – mqpasta

+0

mqpasta >>>谢谢。 – Easyrider

+0

mqpasta >>>如果您将该链接发布为答案,我会将其标记为我的问题的答案。如果你想:D – Easyrider

回答

0

我看着MvcSiteMapProvider.MVC5,我无法让它工作。首先它修改我的Web.config,以至于我的css和js文件在运行我的web应用程序时找不到404。

随着时间我花了MvcSiteMapProvider工作,我可以写我自己的。

所以...这是我自己的生成站点地图xml的沉闷版本。 唯一的是你必须手动指定你的路线。我还没有添加反思,但要通过每个控制器并取消每个操作。

虽然数据驱动的作品效果很好。

在您的主页控制器中添加动作站点地图和专用帮助器方法。 GetRouteUrls是手动添加的控制器/操作路由。 GetDynamicUrls构建数据驱动的Url。在我的例子中,我有一个LiquidsController和一个Details(string id)动作。

public ActionResult Sitemap() 
    { 
     var xml = new XDocument(
       new XDeclaration("1.0", "utf-8", null), 
       new XElement("urlset", 
        new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9") 
        , GetRouteUrls() 
        , GetDynamicUrls() 
        )      
      );       
     return new XmlActionResult(xml); 
    } 

    private List<XElement> GetDynamicUrls() 
    { 
     var result = new List<XElement>(); 
     using (var db = new ApplicationDbContext()) 
     { 
      var liquids = db.Liquids.ToList(); 
      foreach (var liquid in liquids) 
      { 
       result.Add(LocUrl("Liquids", "Details", liquid.FriendlyId)); 
      } 
     } 
     return result; 
    } 

    private List<XElement> GetRouteUrls() 
    { 
     var result = new List<XElement>(); 

     result.Add(LocUrl("Account", "Register")); 
     result.Add(LocUrl("Account", "Login")); 

     result.Add(LocUrl("Home", "Index")); 
     result.Add(LocUrl("Home", "About")); 
     result.Add(LocUrl("Home", "Contact")); 
     result.Add(LocUrl("Home", "TermsOfService")); 
     result.Add(LocUrl("Home", "PrivacyStatement")); 

     result.Add(LocUrl("Liquids", "Index")); 
     result.Add(LocUrl("Vendors", "Index")); 
     result.Add(LocUrl("Hardware", "Index")); 
     return result; 
    } 

    private XElement LocUrl(string controller, string action, string id = null) 
    { 
     if (!string.IsNullOrEmpty(id)) 
      action = string.Format("{0}/{1}", action, id);   
     var baseUri = string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~")); 
     return new XElement("url", 
      new XElement("loc", string.Format("{0}{1}/{2}", baseUri, controller, action)) 
      ); 
    } 

我加入的路线,所以我可以访问网站地图做/网站导航

routes.MapRoute(name: "sitemap", url: "sitemap", defaults: new {controller = "Home", action = "Sitemap"}); 

的XmlActionResult返回类型可以在这里找到: Return XML from a controller's action in as an ActionResult?