En ASP.NET MVC, vous pouvez retourner une redirection ActionResult assez facilement :
return RedirectToAction("Index");
or
return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });
Cela donnera en fait une redirection HTTP, ce qui est normalement correct. Cependant, lorsque vous utilisez Google Analytics, cela pose de gros problèmes car le référent d'origine est perdu, et Google ne sait donc pas d'où vous venez. Cela entraîne la perte d'informations utiles telles que les termes des moteurs de recherche.
Par ailleurs, cette méthode présente l'avantage de supprimer tous les paramètres qui peuvent provenir des campagnes, mais me permet tout de même de les capturer côté serveur. En les laissant dans la chaîne de requête, on risque de voir des gens mettre en signet, sur Twitter ou sur un blog, un lien qu'ils ne devraient pas. J'ai constaté à plusieurs reprises que des personnes ont envoyé sur Twitter des liens vers notre site contenant des identifiants de campagne.
Quoi qu'il en soit, j'écris un contrôleur de "passerelle" pour toutes les visites entrantes sur le site que je peux rediriger vers des endroits différents ou des versions alternatives.
Pour l'instant, je me soucie davantage de Google (que de la mise en signet accidentelle), et je veux pouvoir envoyer à quelqu'un qui visite /
à la page qu'ils obtiendraient s'ils allaient à /home/7
qui est la version 7 d'une page d'accueil.
Comme je l'ai déjà dit, si je fais cela, je perds la possibilité pour Google d'analyser le référent :
return RedirectToAction(new { controller = "home", version = 7 });
Ce que je veux vraiment, c'est un
return ServerTransferAction(new { controller = "home", version = 7 });
qui me permettra d'obtenir cette vue sans redirection côté client. Je ne pense pas qu'une telle chose existe, cependant.
Actuellement, la meilleure chose que je puisse faire est de dupliquer toute la logique du contrôleur pour HomeController.Index(..)
dans mon GatewayController.Index
Action. Cela signifie que j'ai dû déplacer 'Views/Home'
en 'Shared'
pour qu'il soit accessible. Il doit y avoir un meilleur moyen.
0 votes
Qu'est-ce qu'un
ServerTransferAction
que vous essayiez de reproduire ? Est-ce une chose réelle ? (je n'ai trouvé aucune information à ce sujet... merci pour la question, d'ailleurs, la réponse ci-dessous est superbe).1 votes
Recherchez Server.Transfer(...). C'est un moyen de faire une 'redirection' du côté du serveur où le client reçoit la page redirigée sans redirection du côté du client. En général, ce n'est pas recommandé avec le routage moderne.
1 votes
Le "transfert" est une fonctionnalité ASP.NET désuète qui n'est plus nécessaire dans MVC en raison de la possibilité de aller directement à l'action correcte du contrôleur en utilisant le routage. Voir cette réponse pour les détails.
0 votes
@NightOwl888 oui, sans aucun doute - mais parfois aussi, en raison de la logique commerciale, c'est nécessaire/plus facile. J'ai regardé en arrière pour voir où j'avais fini par l'utiliser (heureusement, ce n'était qu'à un seul endroit). J'avais une page d'accueil que je voulais dynamique pour certaines conditions complexes et donc, en coulisses, elle affichait un itinéraire différent. Je veux vraiment éviter cela autant que possible en faveur des conditions de routage ou d'itinéraire, mais parfois un simple
if
La déclaration est une solution trop tentante.0 votes
@Simon_Weaver - Et qu'est-ce qui ne va pas avec la sous-classification ?
RouteBase
pour que vous puissiez mettre votreif
déclaration là au lieu de se plier en quatre pour passer d'un contrôleur à l'autre ?