asp.net-mvc - 在 ASP.NET MVC 中创建 SiteMap

标签 asp.net-mvc url-routing asp.net-mvc-routing sitemap mvcsitemapprovider

我想为 ASP.NET MVC 站点创建 SiteMap。我写这段代码

[XmlRoot("urlset", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")]
    public class Sitemap
    {
        private ArrayList _map;

        public Sitemap()
        {
            _map = new ArrayList();
        }

        [XmlElement("url")]
        public Location[] Locations
        {
            get
            {
                Location[] items = new Location[_map.Count];
                _map.CopyTo(items);
                return items;
            }
            set
            {
                if (value == null)
                    return;
                var items = (Location[])value;
                _map.Clear();
                foreach (Location item in items)
                    _map.Add(item);
            }
        }

        public int Add(Location item)
        {
            return _map.Add(item);
        }
    }

    public class Location
    {
        public enum EChangeFrequency
        {
            Always,
            Hourly,
            Daily,
            Weekly,
            Monthly,
            Yearly,
            Never
        }

        [XmlElement("loc")]
        public string Url { get; set; }

        [XmlElement("changefreq")]
        public EChangeFrequency? ChangeFrequency { get; set; }
        public bool ShouldSerializeChangeFrequency() { return ChangeFrequency.HasValue; }

        [XmlElement("lastmod")]
        public DateTime? LastModified { get; set; }
        public bool ShouldSerializeLastModified() { return LastModified.HasValue; }

        [XmlElement("priority")]
        public double? Priority { get; set; }
        public bool ShouldSerializePriority() { return Priority.HasValue; }
    }

    public class XmlResult : ActionResult
    {
        private readonly object _objectToSerialize;

        public XmlResult(object objectToSerialize)
        {
            _objectToSerialize = objectToSerialize;
        }

        public object ObjectToSerialize
        {
            get { return _objectToSerialize; }
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (_objectToSerialize != null)
            {
                context.HttpContext.Response.Clear();
                var xs = new XmlSerializer(_objectToSerialize.GetType());
                context.HttpContext.Response.ContentType = "text/xml";
                xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
            }
        }
    }

并像这样在 NewsFeedController 中创建 Sitemap 操作

 public ActionResult Sitemap()
        {
            var sm = new Sitemap();
            sm.Add(new Location()
            {
                Url = string.Format("http://www.TechnoDesign.ir/Articles/{0}/{1}", 1, "SEO-in-ASP.NET-MVC"),
                LastModified = DateTime.UtcNow,
                Priority = 0.5D
            });
            return new XmlResult(sm);
        }

并在 RouteConfig 中像这样为 SiteMap 定义新路由

 public static void RegisterRoutes(RouteCollection routes)
        {


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                  "SiteMap_route", // Route name
                  "sitemap.xml", // URL with parameters
                  new { controller = "NewsFeed", action = "Sitemap", name = UrlParameter.Optional, area = "" }, // Parameter defaults
                   namespaces: new[] { "Web.Controllers" }
              );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                 namespaces: new[] { "Web.Controllers" }
            );

        }

但是当输入 /sitemap.xml 得到 error 404

最佳答案

我们对 MvcSiteMapProvider 也有同样的问题适用于 MVC 4 及更高版本。我们通过删除然后替换 web.config 文件中的 UrlRoutingModule 解决了这个问题。

<configuration>
  <system.webServer>
    <modules>
      <remove name="UrlRoutingModule-4.0" />
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
    </modules>
  </system.webServer>
</configuration> 

关于asp.net-mvc - 在 ASP.NET MVC 中创建 SiteMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211845/

相关文章:

c# - 是否可以在同一 Controller 中使用属性路由和基于约定的路由?

asp.net - 如何自动将当前路由的特定值添加到所有生成的链接?

asp.net-mvc - 带计数的 Linq 查询(扩展方法)

c# - 在C#中的字典的第N个位置存储值

asp.net-mvc - 如何在 MVC 5 中为动态填充的页面重写 URL

php - 如何在类似 MVC 的页面中基于漂亮的 URL 加载类?

asp.net - 在 JavaScript 代码中嵌入常量服务器端标签的最佳方法是什么?

.net - 没有nuget包管理器的Nuget包?

android - 为什么我的 Web API 服务器拒绝接受来自 Android 的调用?

c# - 托管站点的 MVC 3 动态路由