serait-il possible de générer automatiquement un sitemap XML pour les moteurs de recherche en itérant les routes et l'action des contrôleurs d'une application? Si vous pouviez me donner une idée, je l'apprécierais. Merci.Générer un sitemap XML automatiquement en utilisant des routes et des contrôleurs dans ASP.NET MVC
Générer un sitemap XML automatiquement en utilisant des routes et des contrôleurs dans ASP.NET MVC
Répondre
Avoir un jarste à ASP.NET MVC SiteMap provider - MvcSiteMap.
Je ne l'ai pas utilisé moi-même, donc je ne peux pas me porter garant de cela, mais cela m'est venu à l'esprit quand j'ai lu votre question.
HTHS,
Charles
Créer un attribut comme celui-ci et l'appliquer à toutes les méthodes que vous voulez que les pages dans le fichier sitemap.xml.
1 /// <summary>
2 /// This attribute indicates that a method is an actual page and gives the data for it
3 /// </summary>
4 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
5 public class MVCUrlAttribute : ActionFilterAttribute
6 {
7 public string Url { get; private set; }
8
9 public MVCUrlAttribute(string url)
10 {
11 this.Url = url;
12 }
13
14 public override void OnResultExecuting(ResultExecutingContext filterContext)
15 {
16 string fullyQualifiedUrl = filterContext.HttpContext.Request.Url.GetLeftPart(UriPartial.Authority) + this.Url;
17 // We build HTML here because we want the View to be easily able to include it without any conditionals
18 // and because the ASP.NET WebForms view engine sometimes doesn’t subsitute <% in certain head items
19 filterContext.Controller.ViewData["CanonicalUrl"] = @”<link rel=”"canonical”" href=”"” + fullyQualifiedUrl + ” />”;
20 base.OnResultExecuting(filterContext);
21 }
22 }
Maintenant utiliser la réflexion pour trouver toutes ces 'pages': -
1 List<string> allPageUrls = new List<string>();
2
3 // Find all the MVC Routes
4 Log.Debug(“*** FINDING ALL MVC ROUTES MARKED FOR INCLUSION IN SITEMAP”);
5 var allControllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(Controller)));
6 Log.DebugFormat(“Found {0} controllers”, allControllers.Count());
7
8 foreach (var controllerType in allControllers)
9 {
10 var allPublicMethodsOnController = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
11 Log.DebugFormat(“Found {0} public methods on {1}”, allPublicMethodsOnController.Count(), controllerType.Name);
12
13 foreach (var publicMethod in allPublicMethodsOnController)
14 {
15 var mvcurlattr = publicMethod.GetCustomAttributes(true).OfType<MVCUrlAttribute>().FirstOrDefault();
16 if (mvcurlattr != null)
17 {
18 string url = mvcurlattr.Url;
19 Log.Debug(“Found “ + controllerType.Name + “.” + publicMethod.Name + ” <– “ + url);
20 allPageUrls.Add(url);
21 }
22 }
23 }
maintenant construire le fichier sitemap.xml de cette liste.
Notez également que ActionFilter place une URL canonique dans votre modèle de vue afin que vous puissiez facilement rendre toutes vos pages conviviales pour les moteurs de recherche, même si vous avez du contenu en double.
Vous NE POUVEZ PAS faire cela à partir des routes car il se peut que vous ayez une seule route pour l'ensemble de votre application {controller}/{action}.
Plus ici: - http://blog.abodit.com/2010/02/sitemap-xml-asp-net-aspnet-mvc/
C'est chouette idée. Merci d'avoir partagé. – coffekid
Merci, ce sera utile – ryudice
Nouvelle URL que 02 Juillet de 2014 https://github.com/maartenba/MvcSiteMapProvider – Manfred