2014-06-10 3 views
2

Je dois créer des URLs de vanité pour un site déjà existant. Les exigences sont les suivantes:Utilisation de routes personnalisées au lieu de/controller/action/{id}

  • Les contrôleurs existants sont une sorte de structure hiérarchique et ne peuvent pas être ignorés ou remplacés de quelque manière que ce soit. Exemples: domain.com/Dog/vanity et domain.com/Cat/vanity.
  • Conserver les actions existantes. Toutes les actions existantes doivent avoir la priorité afin que la page de cette action ne soit pas écrasée par l'url de vanity.
  • prendre les pages et les actions futures en compte afin que l'exigence ci-dessus est atteint (une nouvelle URL de vanité est ignorée et l'action/vue exécuté à la place)

À ce jour, j'ai essayé différentes solutions avec routage qui permettent moi d'avoir domain.com/vanity ce qui est bien mais les gars du marketing n'aiment pas à cause des différents départements au sein de l'entreprise. J'ai essayé le routage qui écrase les actions existantes et les traite toutes comme des vanités (aussi pas réalisable). J'ai une solution en place qui gère par programme l'URL qui a été demandée et redirige vers une page qui existe réellement mais qui n'est pas évolutive en aucune façon. Jusqu'à présent, je sais que la partie vanité peut être traitée comme un paramètre de l'action afin que je puisse déclencher la page par défaut dans la route (Index) mais cela, jusqu'à présent, ne conserve pas la structure .

TL; DR: I besoin d'une solution qui permet de domaine/contrôleur/structure de courtoisie tout en permettant domaine/contrôleur/action

+0

Essayé http://attributerouting.net/? –

+0

Merci. Je n'avais pas entendu parler de ça. Je le regarde en ce moment. Le moins que j'ai à ajouter au projet de site, le mieux (il est remplacé dans quelques mois, mais les gens du marketing le veulent maintenant.) Je ne suppose pas que vous avez une phrase TL; DR de ce plugin? – MetalPhoenix

+0

Fondamentalement (après la configuration), vous ajoutez '[Route (" une-zone-ou-chaîne/une-action-ou-chaîne ")]' à vos actions et appelez www.example.com/an-area-or- string/some-action-or-string pour accéder à cette action. –

Répondre

4

En utilisant AttributeRouting for MVC4 vous pouvez accomplir une solution de travail jusqu'à ce que vous RAMP le projet de remplacement. Cela vous permettra de conserver les routes existantes tout en ajoutant de nouvelles routes personnalisées avec peu d'impact.

[Route("my-vanity/is-cool/post/{id}")] 
public ActionResult Index(int id) 
{ 
} 

L'important est de se rappeler la priorité, vous écrivez donc des itinéraires qui n'écrasent/ne sont pas remplacées par des voies existantes. Vous pouvez diriger cela dans une certaine mesure avec des propriétés sur l'attribut. Ci-dessous est juste un exemple qui mettra la dernière route ajoutée en priorité pour l'ensemble du site.

[Route("my-vanity/is-cool", SitePrecedence = -1)] 
public ActionResult Index() 
{ 
} 
+0

voici +1 pour cela :) – jgauffin

+0

@jgauffin A la vôtre. J'avais oublié que WebApi2 l'avait intégré, mais puisqu'il utilise les mêmes bibliothèques de base que MVC 5, ce n'est pas surprenant. :) –

+0

Merci pour la solution et le TL; DR. :) – MetalPhoenix

1

ASP.NET WebApi2 ont un support intégré pour le routage attribut. Avec elle, vous pouvez définir les URL de quelque manière que vous aimez (au lieu de suivre le modèle /controller/action)

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

+0

Je vais marquer cela comme une réponse même si ce n'est pas exactement ce dont j'ai besoin. Ce serait la réponse techniquement correcte mais le commentaire de attributerouting.net me donne la solution exacte dont j'ai besoin pour ce cas: manipuler des urls de vanité spécifiques avec un minimum de changements de codage et de logique (le site est un gâchis piraté et disparait dans plusieurs mois) ainsi que la possibilité d'affecter le réacheminement à toute action à des fins de suivi sans faire d'histoires. Ce sera toutefois la solution sur le site de remplacement que nous sommes en train de lancer. – MetalPhoenix

+0

Ensuite, demandez à @ J.Steen de fournir une réponse et acceptez celle-ci. – jgauffin

+0

@MetalPhoenix: Steen a ajouté une réponse, acceptez celle-ci car c'est ce qui a fonctionné pour vous. – jgauffin

Questions connexes