2010-10-21 4 views
5

Nous essayons d'utiliser des routes personnalisées dans une application ASP.NET MVC pour générer cet URL: 'http://example.com/Person/unnecessaryinfo-42'. Le "inutileinfo" est le nom de l'id qui rendra l'URL piratable pour l'utilisateur. Voici le code de notre carte d'itinéraire. Cela fonctionne mais mon action de contrôleur se termine par "unnecesaryinfo-42" dans le paramètre id. Est-ce que je peux enlever le "fichier inutile" avant qu'il n'atteigne l'action du contrôleur?Comment supprimer des informations inutiles d'une URL conviviale avant d'accéder à une action de contrôleur

routes.MapRoute("person_id", "person/{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"unnecessaryinfo-\d" }); 

Edit:

Voici notre dernier code:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

Le chapitre sur le routage de ASP.NET MVC 2 In Action (page 234) traite d'éviter l'utilisation des ID de base de données chaque fois que possible, mais si vous devez les utiliser , en ajoutant des informations supplémentaires pour rendre l'URL lisible. C'est ce que nous essayons (sans succès) de faire. L'identifiant de la base de données est actuellement compris entre 1 et 6 chiffres (et peut augmenter au fil du temps).

Répondre

5

Votre dos-et-vient sur Darin's answer me fait croire que vous avez probablement une autre voie qui est adaptée et utilisée à la place de cet itinéraire:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

Changement de l'ordre dans lequel les routes sont ajoutés au RouteCollection devrait résoudre le problème. Des itinéraires plus spécifiques devraient être les premiers ajoutés à la collection. Par exemple, si vous avez aussi cette voie:

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

Il devrait apparaître après votre route plus spécifique « person_id » si votre code ressemblerait à ceci:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

L'URL de votre fournie 'http://example.com/Person/unnecessaryinfo-42' correspondra à deux routes, mais puisque votre route plus spécifique apparaît en premier c'est la route qui sera utilisée. Quand une URL moins spécifique est mappée, elle ne correspondra pas à la première et donc la deuxième route sera utilisée.

Cela dit, déterminer quels itinéraires correspond à une URL peut être un peu délicat. Heureusement, il y a deux très bonnes options qui aident avec le débogage d'itinéraire:

solution de Stephen est probablement le meilleur pour le long terme utiliser, mais Phil est certainement le plus facile à mettre en œuvre pour le débogage et le débogage sale. Je commencerais par réorganiser vos itinéraires, mais si cela ne résout pas le problème, utilisez l'un des débogueurs mentionnés ci-dessus.

3
routes.MapRoute(
    "person_id", 
    "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"\d" } 
); 

Vous pouvez également ajouter une contrainte regex dans le jeton de route unnecessaryinfo.

+0

J'ai essayé exactement ce que vous avez ci-dessus et il me donne toujours "inutileinfo-id" au contrôleur. Je ne comprends pas non plus ce que vous entendez par "Vous pourriez aussi ajouter une contrainte de regex dans le jeton de route" inutile ". – rkgallegos

+0

Quelle URL utilisez-vous? '~/customer/details/foobarunnecessary-5' et' public ActionResult Details (identificateur de chaîne) 'vous donnera' id = 5' dans cette action du contrôleur.Notez également que '\ d' signifie un chiffre ** unique **. Si vous utilisez '~/customer/details/foobarunnecessary-123' et que vous avez toujours la route par défaut à la fin (' {controller}/{action}/{id} '), alors cette route par défaut correspondra et non votre route personnalisée et vous obtiendrez 'id = foobarunnecessary-123' dans votre action de contrôleur. –

+0

L'URL de fin à laquelle nous essayons d'accéder est ~/Person/unusedinfo-42 et le nombre de chiffres varie et peut aller de 1 à 6 ou plus. – rkgallegos

Questions connexes