58 votes

Inclure les valeurs de hachage dans les routes URL d'ASP.NET MVC

Je dois mettre en œuvre une valeur de hachage, c'est-à-dire que l'URL doit ressembler à ceci :

/home/index/#create

Pour cela, nous avons ajouté une route :

routes.MapRoute(
    "Default",    // Route name
    "{controller}/{action}/#{detail}",    // URL with parameters
    new { controller = "Login", action = "LogIn",  detail  =""}  // Parameter defaults
);

Sur l'accès /home/index/#create il me redirige vers la route par défaut.

Comment cela peut-il être fait ?

2 votes

D'après certaines réponses. Je sais qu'avec #hash, le navigateur n'envoie pas de requête au serveur MAIS seulement lorsque l'URL change pour la deuxième fois dans la même page. Cette question a donc encore un sens. Pensez que si l'utilisateur met cette URL en signet, le #hash peut faire référence à une ancre de commentaire ou représenter un menu sélectionné. Je cherche toujours la bonne façon de faire cela en route.

117voto

Rory McCrossan Points 69838

Comme indiqué, il n'y a aucun moyen de le faire en utilisant le routage. La seule solution possible est d'ajouter le fragment # à votre url lors de la redirection dans les actions de votre contrôleur. Par exemple.

return Redirect(Url.Action("Index", "Home") + "#create");

11 votes

Cela devrait être la réponse acceptée. Le PO a demandé "Comment faire ?" et c'est la seule réponse qui vous donne une solution de rechange raisonnable, plutôt que de vous expliquer pourquoi vous ne pouvez pas le faire de la manière dont le PO voulait le faire.

1 votes

Je viens de passer 20 minutes à essayer de comprendre comment faire en sorte qu'une méthode "return View()" autorise un paramètre de hachage, ou tout autre résultat d'action - ceci est parfait. Bonne réponse !

1 votes

Merci pour cette réponse ! J'ai récemment dû mettre en œuvre la même chose, et cela a fonctionné pour moi. Cependant, je l'ai exécuté dans le HTML, ce qui a nécessité une syntaxe légèrement différente : href="@Url.Action("Index","Home")#deep-link"

52voto

Darin Dimitrov Points 528142

Vous ne pouvez pas récupérer la valeur après le # sur le serveur, simplement parce que cette valeur n'est jamais envoyée au serveur. Seul le javascript côté client a accès à cette valeur, donc définir des routes avec un hash n'a pas beaucoup de sens.

12 votes

C'est logique. Mon #hash utilisé pour mémoriser le menu sélectionné (je ne veux pas de cookie). Lorsque l'utilisateur clique sur un menu, le # modifié et une requête AJAX au serveur pour mettre à jour le contenu respectif. De cette façon, l'utilisateur peut marquer d'un signet la page avec le menu sélectionné et peut utiliser le bouton retour du navigateur avec un contenu lisible. #menuname . La prochaine fois que l'utilisateur naviguera avec le # alors la page chargée contient déjà le menu sélectionné sans requête AJAX inutile. J'ai besoin de lier la valeur de hachage dans les données de la route parce que chaque # peut être considérée comme une page différente.

1 votes

Vous pourriez utiliser le javascript pour envoyer cette information au serveur dans le cadre d'une demande de formulaire.

0 votes

REMARQUE : certaines API, comme le service d'identité de Google, utilisent la valeur de l'attribut #hash pour conserver le jeton en vue d'un échange lors du prochain appel. Ce serait donc bien d'avoir une réponse à ce sujet.

7voto

Robert Levy Points 18154

Lorsqu'un navigateur fait une demande d'URL, il n'envoie rien après un hachage au serveur. Cette route peut vous permettre de générer URLs contenant la valeur de hachage mais il n'y a aucun moyen de faire quoi que ce soit. côté serveur lorsque l'utilisateur navigue vers une telle URL. C'est comme ça que fonctionne le web...

0voto

Joel Wiklund Points 1173

Flux implicite OAuth 2.0

Si cela a à voir avec [OAuth 2.0 Implicit Flow](https://oauth.net/2/grant-types/implicit/) vous devez utiliser [Authorization Code Grant](https://oauth.net/2/grant-types/authorization-code/) à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X