2011-03-10 3 views
0

Je suis novice en matière de routage MVC et d'URL et je recherche des conseils.Problèmes de routage d'URLs ASP.NET MVC

Je voudrais être en mesure d'avoir une URL par utilisateur, avec le format: http://www.example.com/username

J'ajouté l'itinéraire suivant:

routes.MapRoute(
    "UserRoute", // Route name 
    "{username}", // URL 
    new { controller = "Users", action = "ViewUser", username = UrlParameter.Optional } 
); 

Ce qui fonctionne très bien si elle est la voie FIRST , mais il a foiré la route {controller}/{action}/{id} par défaut. Maintenant, quand j'essaie de visiter la page racine, il essaie de charger mon action UsersController "ViewUser" avec un paramètre nul (ou avec "favicon.ico" comme paramètre).

Si je mets ma nouvelle route après l'itinéraire par défaut, alors MVC essaie de trouver le contrôleur appelé username et échoue parce qu'il ne peut pas le trouver.

Y at-il un moyen d'avoir des URL du formulaire {username} sans déblayer le système de routage régulier? Je pourrais probablement écrire une route personnalisée pour chaque contrôleur que j'ai, mais cela semble sujet aux erreurs.

+0

Vous avez raison, le routage est sujet aux erreurs. Checkout http://mvccoderouting.codeplex.com/ si vous voulez oublier complètement les problèmes de routage. –

Répondre

1

Vous pouvez consulter this link et voir si ça aide. Il crée également des URL avec juste un nom d'utilisateur sur eux.

+0

Cette solution (qui utilise la réflexion pour trouver tous les autres contrôleurs) semble un peu bizarre, mais je suppose que ça devrait marcher. Je suppose que ce schéma d'URL particulier n'est pas celui que l'équipe MVC a anticipé. –

1

Vous pouvez appliquer une contrainte aux valeurs de contrôleur autorisées pour la route par défaut, au lieu de créer une route pour chaque contrôleur.

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL 
    new { controller = "controller1", action = "defaultaction", id = UrlParameter.Optional }, //default values 
    new { controller = @"controller1|controller2|controller3|..." } 
); 

lorsque le contrôleur ne correspond à aucun de ceux qu'il va essayer la prochaine voie

+0

Cela peut fonctionner, mais ce n'est pas vraiment mieux que de lister chaque contrôleur individuellement. Je dois toujours me rappeler d'énumérer chacun et chacun, et JE SAIS que dans une année je vais ajouter un nouveau contrôleur et ensuite passer une heure à lutter contre 404 avant que je me souviens du piratage de routage que j'ai utilisé. –

+0

@Henry, c'est un problème de logique. Puisque les deux routes satisfont l'URL racine, l'ordinateur doit-il comprendre ce qu'il faut charger? il utilise juste le premier sur. Vous pouvez changer votre URL 'UserRoute' pour qu'elle soit' 'user/{username}' 'pour la réparer, mais cela change le modèle d'URL que vous voulez .. –