我正在尝试创建一个自动网站地图ActionResult,以输出有效的sitemap.xml文件。实际生成的文件不是一个问题,但我似乎不知道如何填充URL的系统中的列表。这里是我到目前为止的代码:
public ContentResult Sitemap() { XNamespace xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"; XElement root = new XElement(xmlns + "urlset"); //some kind of foreach here to get the loc variable for all URLs in the site //for each URL in the collection,add it to the root element as here //root.Add( // new XElement("url",// new XElement("loc","http://google.com"),// new XElement("changefreq","daily"))); using (MemoryStream ms = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(ms,Encoding.UTF8)) { root.Save(writer); } return Content(Encoding.UTF8.GetString(ms.ToArray()),"text/xml",Encoding.UTF8); } }
例如,假设我有两个控制器,每个控制器有两个与它们相关的动作:
HelpController
>编辑
>创建
AboutController
>公司
>管理
我似乎不知道如何得到一个URL列表像:
> http://localhost/help/edit
> http://localhost/help/create
> http://localhost/about/company
> http://localhost/about/management
解决方法
我发布了一个自己做的答案下面。但这里是一个包,它开箱即用的MVC网站:
http://mvcsitemap.codeplex.com/(< - 旧网站,但有广泛的文档!) https://github.com/maartenba/MvcSiteMapProvider/wiki(< - 移动到新网站,缺少一些文档,而不是活动) 注意它做了很多事情:
>自动在Mvc路由中注册自身以响应SEO /sitemap.xml请求(即使没有/sitemap.xml的物理文件)。这是完全兼容所有的搜索引擎机器人,我发现,以及滚动,当它达到10,000,等。
>带有一组局部视图,用于BreadCrumb导航内置!我们使用这个相当广泛,虽然动态数据部分是有点麻烦,它的工作。
>包含一系列部分视图,用于菜单控制。
>荣誉控制器和操作方法的[授权]安全位。
所有上述点均由您编辑和配置的单个mvc.sitemap XML文件控制。我已经使用这个在一些项目现在做2或3的以上点。有它所有可配置在1个地方,并动态生成,是真的很好。
虽然我发现创建动态数据提供者的能力有点麻烦(并严重违反任何类型的IoC你希望做),它确实得到工作完成和缩放,一旦你绕过他们的缓存和使用自己的。