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.
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 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’
puis déployez votre application MVC sur ce site