URL relative dans JQuery Post Call

J’ai la situation suivante.

J’ai développé ma première application MVC Asp.Net. il fonctionne sur mon serveur à l’adresse suivante

http://localhost:59441/ 

J’ai écrit quelques méthodes de publication JQuery qui ressemblaient à ceci

  $.ajax({ type: "POST", url: "/CeduleGlobale/UpdateCheckBox", ... 

CeduleGlobale est mon ControllerName et UpdateCheckBox est mon methodName

Lorsque je mets l’application sur le serveur de test, elle est placée dans un répertoire virtuel.

donc l’application est maintenant

 http://testServer/JprApplication/ 

plus de port à spécifier et aussi un nom d’application

Lorsque j’ai commencé à tester, j’ai rapidement remarqué que mes appels JQuery Post ne fonctionnaient plus …

Je les ai modifiées alors maintenant l’URL est

 /JprMvc/CeduleGlobale/UpdateCheckBox 

le problème est 2 fois.

  1. cela rend difficile le test sur ma machine de développement car IIS Express ne me permet pas de spécifier un répertoire virtuel.
  2. Je n’aime pas le codage en dur du nom de répertoire virtuel dans JQuery, car je ne sais pas quel nom l’application aura dans l’environnement de production et je devrai donc modifier mon script avant de pouvoir installer l’application en production.

Je suis sûr qu’il me manque quelque chose de base pour simplifier cela.

Merci

En fonction de l’emplacement réel de votre JavaScript (dans la vue ou dans un fichier JS séparé), vous disposez de plusieurs options.

Option 1 – À l’intérieur de la vue

Utilisez simplement les aides HTML pour générer les liens pour vous

  

Option 2 – Fichier JS autonome

Nous avons généralement une fonction par page qui configure les gestionnaires de cette page. Donc, nous pouvons faire quelque chose comme ceci:

Vue

  

Fichier JS autonome

 function SetOrderPage(ajaxPostUrl){ $.ajax({ type: "POST", url: ajaxPostUrl )}; } 

Option 3 – Fichier JS autonome, méthode 2

Vous pourriez avoir une variable globale dans votre fichier JS qui est le siteroot. L’inconvénient ici est que vous devrez créer manuellement chacun de vos chemins de méthode d’action. Sur chaque page, vous pouvez définir la variable globale racine du site en tant que telle:

Fichier JS autonome

 var siteRoot; 

Vue

  

N’oubliez pas que vous ne pouvez pas utiliser la syntaxe Razor dans un fichier JS autonome. Je pense qu’il est préférable de laisser Razor / MVC / .NET vous donner de manière dynamic le chemin du site ou la route de l’URL, car cela réduira réellement les erreurs pouvant être commises lors du déplacement entre les sites / répertoires virtuels.

Autant que je sache, il n’y a pas d’autre moyen de contourner cela. À moins que vous ne souhaitiez utiliser des URL relatives, à savoir:

 $.ajax({ type: "POST", url: "./CeduleGlobale/UpdateCheckBox", ... 

Mais cela peut devenir compliqué pour diverses raisons lorsque vous modifiez le code. Vous pouvez également préfixer l’URL définie globalement. Par conséquent, il vous suffit de la modifier une seule fois avant de passer en production.

c’est à dire

 //Globally defined serverRoot serverRoot = "http://someaddress/somevirtualdirectory"; $.ajax({ type: "POST", url: serverRoot + "/CeduleGlobale/UpdateCheckBox", ... 

Ainsi, si vous n’en avez pas besoin, vous pouvez simplement configurer serverRoot = ''; et tout sera de retour à la situation actuelle.

JQuery rencontrait ce problème avec MVC 5 et je suis donc allé à cette solution qui élimine le problème lorsque vous êtes dans Localhost et dans n’importe quel navigateur même lorsque vous déployez une application dans un sous-dossier.

 var pathname = window.location.pathname; var VirtualDirectory; if (pathname.indexOf("localhost") >= 0 && pathname.indexOf(":") >= 0) { VirtualDirectory = ""; } else { if ((pathname.lastIndexOf('/')) === pathname.length + 1) { VirtualDirectory = pathname.subssortingng(pathname.indexOf('/'), pathname.lastIndexOf('/')); } else { VirtualDirectory = pathname; } } 

Et puis dans tout appel ajax:

 $.post(VirtualDirectory + "/Controller/Action", { data: data}, "html") .done(function (result) { //some code }); 

Je sais que c’est un ancien post. Mais j’avais le même problème et je me suis retrouvé ici. Et réussi à résoudre ce problème avec la méthode UrlHelper.Action . Il devrait être utilisé quelque chose comme ça. (Notez que cette solution spécifique fonctionnera dans la vue.)

 url: "@Url.Action("UpdateCheckBox", "CeduleGlobale")", 

J’espère que cela t’aides. 🙂

Passez @ Url.Action (“action”, “contrôleur”) au javascript de la vue. Cela lui permettra d’être mis à jour de manière dynamic au moment de l’exécution.

  

Il peut y avoir une fonction pour obtenir le chemin racine que vous pourriez également utiliser pour initialiser les variables racine dans les réponses précédentes.

http://localhost:59441/ et
http://testServer/JprApplication/ fonctionnera à la fois avec votre

$.ajax({ type: "POST", url: "/CeduleGlobale/UpdateCheckBox", ...

si votre hébergement dans iis vous avez juste besoin de créer un hôte virtuel dans votre
C:\Windows\System32\drivers\etc\hosts

fichier. Ajoutez cette ligne au bas de votre fichier hosts

127.0.0.1 CeduleGlobale

créer un nouveau site comme si créer un nouveau site comme celui-ci, sélectionnez des sites, faites un clic droit et créez un nouveau site

remplissez vos coordonnées et définissez le même nom d'hôte que celui que vous avez créé ci-dessus 'CeduleGlobale'

remplissez vos coordonnées et définissez le même nom d’hôte que celui que vous avez créé ci-dessus ‘CeduleGlobale’

puis déployez votre application MVC sur ce site