2010-01-22 6 views
17

Dire que j'ai le site http://localhost/virtual où virtuel est le répertoire virtuelJavascript dans le répertoire virtuel pas au courant de répertoire virtuel

J'ai une requête Ajax qui est défini dans un fichier javascript en utilisant JQuery

$.getJSON("/Controller/Action") 

Lorsque cela est appelé, le client essaie de trouver l'URL au niveau racine, c'est-à-dire http://localhost/Controller/Action

Si j'ajoute le symbole tilde (~) en, il se transforme en http://localhost/virtual/~/Controller/Action

Il devrait (si elle était de faire ce que je voulais) résoudre à http://localhost/virtual/Controller/Action

Toutes les idées sur la façon de résoudre ce problème?

+0

Ne semble pas être un moyen, donc je viens de mettre un chemin relatif par ex. ../Controller/Action – Dann

+0

Cela aide si vous nous dites la sortie attendue. Vous nous dites seulement deux sorties que vous ne voulez pas. Qu'est-ce que tu veux? – slebetman

+0

Je veux qu'il soit produit en tant que http: // localhost/virtual/Contrôleur/Action – Dann

Répondre

22

l'indice de Aku ci-dessus avait l'air bien, mais il ne voulait pas travailler pour moi. Enfin j'ai compris à l'utiliser comme ceci

<script type="text/javascript"> 
    var config = { 
     contextPath: '<%= @Url.Content("~") %>' 
    }; 
</script> 

puis dans mon JavaScript Je l'utilise comme ceci

config.contextPath + « myAppPath ».

Donc, dans le cas d'aucun répertoire virtuel ce décide de "/" + "myAppPath" et dans le cas d'un répertoire virtuel cela résout à "/ VirtualPath /" + + "myAppPath"

et cela a finalement fonctionné pour moi.

+0

Fonctionne magnifiquement pour moi! Et simple :) –

2

Peut-être que $.getJSON("Controller/Action") fera l'affaire?

+0

Non, il s'ajoute simplement au chemin. Cela pourrait fonctionner si le fichier js était à la racine. – Dann

2

Le raccourci de tilde pour le chemin racine de votre application est une fonctionnalité spéciale d'ASP.NET, qui ne fait pas partie des URL elles-mêmes. Par conséquent, essayer d'utiliser une URL avec un tilde de JavaScript ne résoudra pas la racine du site, cela vous donnera simplement un ~ comme vous pouvez le voir.

Vous devez transmettre la valeur du chemin d'accès racine de l'application à JavaScript afin qu'il puisse créer lui-même des URL. Je ne suis pas familier avec ASP.NET, mais je crois que vous pourriez faire quelque chose comme:

<script type="text/javscript"> 
    var approot= <%= JavaScriptSerializer.Serialize(Request.ApplicationPath) %>; 
    ... $.getJSON(approot+'/Controller/Action') ...; 
</script> 

Une façon plus simple de le faire si vous savez qu'il ya un lien sur la page à la AppRoot serait de lire le href de ce lien:

var approot= $('#homepagelink').attr('href'); 
0

chemin relatif au fichier JS était la seule solution que j'ai trouvé $ .getJSON (» ../ Contrôleur/Action ")

14

J'ai utilisé cette solution avec succès

Placer l'élément suivant dans votre masterpage

<%= Html.Hidden("HiddenCurrentUrl", Url.Action("Dummy"))%> 

Déclarez une variable globale dans votre fichier principal javascript

var baseUrl = ""; 

Set baseUrl à la valeur de "HiddenCurrentUrl" lorsque votre javascript est chargé

baseUrl = $("#HiddenCurrentUrl").val(); 
baseUrl = baseUrl.substring(0, baseUrl.indexOf("Dummy")); 

Utilisez baseUrl

$.getJSON(baseUrl + "Action") 

EDIT améliorée solution

Dans votre contrôleur

ViewBag.BaseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath + "/"; 

Dans votre page maître

<script type="text/javascript"> 
    var YourNameSpace = YourNameSpace || {}; 
    YourNameSpace.config = { 
     baseUrl: "@ViewBag.BaseUrl" 
    } 
</script> 

Utilisez votre baseUrl

$.getJSON(YourNameSpace.config.baseUrl + "Action") 
+0

Je marque cela comme la réponse car c'est funky, et j'aime les mélanges funky de jQuery et MVC. Bien que je puisse utiliser quelque chose de différent pour utiliser Url.Action comme la chose sous-chaîne n'est pas si propre – Dann

+0

Super que vous avez trouvé cela utile! Je ne suis pas satisfait de la solution Url.Action, alors dites-moi comment vous finissez par le résoudre. Je déteste les trucs d'URL. Toujours des problèmes entre les environnements dev/test/prod. – Andreas

+0

J'ai aussi voté. C'est génial, mais je suis incapable de penser à une solution plus élégante en ce moment et cela fonctionne ... intelligent. –

4

Une autre façon d'obtenir une URL de base est

<script type="text/javascript"> 
    window.g_baseUrl = '@Url.Content("~")'; 
</script> 

Par exemple, si vous exécutez votre application à partir UnNom répertoire virtuel puis window.g_baseUrl volonté variables être égal à /SomeName/

Le bénéfice de cette méthode est une capacité d'appeler des actions dans les autres contrôleurs comme si

$.getJSON(window.g_baseUrl + "AnotherController/Action") 
0

Je sais que cette question est très ancienne, mais je luttais ces derniers temps avec cette question et a pu le résoudre en utilisant

url:'<%=VirtualPathUtility.ToAbsolute("~/Include/cntrols/Data.aspx") %>', 

Cela fonctionne très bien dans mon appel ajax ...

0

Il est trop en retard pour répondre à cette question.Mais peut être utile à quelqu'un car j'ai eu le même problème. Au lieu de faire toutes ces étapes mentionnées dans les réponses ci-dessus, mieux vaut utiliser

Url.Action('action','controller').

Il va générer l'URL /VIRDIR/controller/action s'il est exécuté à partir du répertoire virtuel ou générer /controller/action dans les autres cas.

Questions connexes