web-dev-qa-db-fra.com

Redirection vers une action à partir de javascript

J'ai un projet MVC4 et, côté client, je dois rediriger vers une méthode d'action spécifique. J'ai lu le post suivant Comment rediriger vers l'action depuis la méthode JavaScript? , et plus bas, il y a un commentaire sur l'utilisation de:

window.location.href = "/{controller}/{action}/{params}";

et j'avais déjà essayé cela, mais cela ne fonctionne pas pour le lieu où mon projet est installé dans IIS.

Mon projet a été publié sur: http://localhost/SomeName.SomeOtherName/

et je dois arriver à: http://localhost/SomeName.SomeOtherName/Home/Logout

Lorsque j'utilise le '/ Controller/Action' comme recommandé dans le post précédent, j'arrive ici: localhost/Home/Logout et ce n'est pas correct.

J'ai essayé de conserver l'emplacement publié (identique à la chaîne de publication ci-dessus) dans un fichier web.config et de construire la chaîne (concaténer: emplacement de publication + '/ Home/logout'), mais cela n'a pas fonctionné non plus. Vous trouverez ci-dessous la position que j'utilise pour cela. Ce qui est étrange, c'est que cela ne fait que concaténer l'URL de la page en cours avec mon URL construite. Non seulement cela n’est pas valide, mais j’obtiens aussi l’une de ces erreurs 'potentiellement danger. request.path ...'.

 window.location.href = "\"" + url + "/Home/logout" + "\"";

La même chose se produit si j'utilise $ (location.hostname) pour construire ma chaîne.

Des pensées?

4
RichieMN

Utilisez toujours des aides d’URL lors de la génération d’URL pour une action de contrôleur. Par exemple, si votre script de redirection est situé dans la vue, vous pouvez le faire:

<script type="text/javascript">
    window.location.href = '@Url.Action("LogOut", "Home")';
</script>

L'assistant côté serveur Url.Action s'assurera ici que l'URL appropriée est générée, que votre application soit hébergée dans un répertoire virtuel ou non.

Si dans l’autre cas, votre javascript est situé dans un fichier js séparé (ce qui est évidemment la meilleure pratique), dans lequel vous ne pouvez pas utiliser d’aides côté serveur, vous avez alors deux possibilités:

  • Utilisez une variable javascript globale calculée dans la vue et utilisée par votre script:

    <script type="text/javascript">
        var logoutUrl = '@Url.Action("LogOut", "Home")';
    </script>
    

    et ensuite quelque part dans votre script:

    window.location.href = logoutUrl;
    
  • Utilisez l'attribut HTML5 data- * sur un élément du DOM qui sera associé de manière ou d'autre avec le déconnexion d'un utilisateur. Par exemple, cela pourrait être une div ou un bouton:

    <div id="logout" data-url="@Url.Action("LogOut", "Home")">Log out</div>
    

    et ensuite dans votre script:

    $('#logout').click(function() {
        window.location.href = $(this).data('url');
    });
    

    Évidemment, cela semble être un exemple stupide et simpliste, car dans ce cas particulier, vous auriez simplement utilisé un Html.ActionLink pour générer une ancre LogOut sans vous soucier de javascript, ni de choses de ce genre, mais espérons-le vous donner un exemple scénario du monde.

Remarquez comment, dans tous les exemples, un utilitaire d’URL est utilisé pour générer l’URL appropriée de l’action du contrôleur et prendre en compte tous les répertoires virtuels possibles. C'est la règle la plus importante: never hardcode une URL dans une application ASP.NET MVC.

28
Darin Dimitrov

Bien que cela puisse sembler aléatoire, cela a impliqué la situation ci-dessus car tout apparaissait dans une fenêtre contextuelle dynamique. Il y a 2 boutons (déconnexion, continuer) et une image. J'avais du mal à faire en sorte que l'image apparaisse correctement et je voulais un lien dynamique utilisant des assistants. J'ai résolu le problème en utilisant le code suivant:

  var siteRoot = "@(Request.Url.Scheme)://@(Request.Url.Host)@(Url.Content("~"))"; 

Quelqu'un voit quelque chose de mal avec ça? Tous les autres exemples d'assistance d'URL incluaient toujours le contrôleur et la méthode et j'avais besoin d'une valeur racine complète et valide. Pensées?

0
RichieMN