J'ai développé un CMS MVC pur pour m'amuser et j'ai été confronté à un bogue/une fonctionnalité gênant du routage ASP.NET.Extension du routage RouteCollection dans le routage ASP.NET
Chaque page dynamique gérée de mon CMS est associée à une route particulière extraite de la base de données. Ceux-ci sont chargés au démarrage de l'application. Lorsqu'un utilisateur ajoute une nouvelle page ou modifie l'URL d'une page existante, je dois être en mesure de modifier RouteTable pour insérer/modifier l'itinéraire en conséquence.
Le problème est que la nouvelle route n'a pas besoin d'être simplement ajoutée à la fin de RouteCollection, mais qu'elle doit être insérée dans une position particulière. Semble assez logique sauf que RouteCollection contient seulement une méthode Insert(int idx, RouteBase route)
héritée de Collection<T>
qui ne contient pas le nom de la route. Le nom de la route est important car je l'utilise partout pour générer des liens d'action.
En regardant le réflecteur Je ne vois pas de moyen facile d'étendre cette collection car le dictionnaire _namedMap est marqué comme privé. J'ai essayé de découper la collection au moment de l'insertion et de ré-ajouter chaque élément, mais comme il n'y a aucune méthode pour rechercher le nom d'une route dans RouteCollection, je ne peux pas les rajouter avec le nom qu'ils avaient auparavant. Si frustrant!!!
Pourquoi le nom de l'itinéraire n'est-il pas une propriété de l'objet route? Pourquoi si MS est sérieux au sujet de l'extension de MVC et du routage, est-ce que les classes cruciales sont difficiles à étendre?
Des suggestions sur la meilleure solution ici?
Edit:
Ok peut-être j'aurais beaucoup beaucoup plus claire ici. Je ne cherche pas une critique de mon design CMS. J'apprécie les commentaires mais ce n'est pas ce que je demande.
Question simplifiée. Comment puis-je insérer un itinéraire nommé dans la collection de routes au moment de l'exécution? La méthode d'insertion en cours sur la classe est insuffisante car elle n'inclut pas le nom.
Cheers,
Ian
Pourquoi avez-vous exactement le mappage 1-à-1 des routes vers les pages gérées?Vous pourrez peut-être simplifier la structure de votre URL pour pouvoir continuer à réutiliser les mêmes itinéraires indépendamment de la page gérée. –
@Berin: Ah, oui. Je n'avais pas pensé à ça. Une route par page est en effet un mauvais design. Devrait utiliser des valeurs de paramètre dans un itinéraire existant pour identifier les pages. –
Je n'étais pas très clair, par exemple j'ai une page de détails de blog géré avec l'URL de post/{nom}/{id} et je n'ai pas à gérer l'analyse de l'url. J'ai une capture tout à la fin du bloc d'itinéraire géré qui gère les URLs simples simples, donc ce n'est pas tout à fait une route par page de son itinéraire par page dynamique + 1. Mon problème est toujours présent. – madcapnmckay