2010-01-22 56 views
17

Decir que tengo el sitio http://localhost/virtual donde virtual es el directorio virtualJavascript en Directorio virtual conscientes de directorio virtual

tengo una petición Ajax que se define en un archivo Javascript usando jQuery

$.getJSON("/Controller/Action") 

Cuando se invoca esto, el cliente intenta encontrar la url en el nivel raíz, es decir, http://localhost/Controller/Action

Si agrego el símbolo tilde (~) en, se convierte en http://localhost/virtual/~/Controller/Action

Debe (si fuera a hacer lo que quería) a resolver http://localhost/virtual/Controller/Action

¿Alguna idea sobre cómo solucionar este problema?

+0

No parece ser una manera, así que acabo de poner una ruta relativa, p. Ej. ../Controller/Action – Dann

+0

Ayuda si nos dices el resultado esperado. Solo nos estás diciendo dos resultados que NO deseas. ¿Qué deseas? – slebetman

+0

Quiero que se muestre como http: // localhost/virtual/Controller/Action – Dann

Respuesta

22

pista de Aku anterior parecía correcta, pero no quería trabajar para mí. Finalmente me di cuenta de que utilizar de esta manera

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

y luego en mi JavaScript lo uso como esto

config.contextPath + 'myAppPath".

Así que en caso de no este directorio virtual resuelve "/" "myAppPath" + y en el caso de un directorio virtual de esto se resuelve con "/ rutaDeAccesoVirtual /" "myAppPath" + +

y esto finalmente funcionó para mí.

+0

¡Funciona maravillosamente para mí! Y simple :) –

2

Tal vez, $.getJSON("Controller/Action") hará?

+0

No, simplemente se agrega a la ruta de acceso. Podría funcionar si el archivo js estaba en la raíz. – Dann

2

El acceso directo tilde para la ruta de acceso de la raíz de la aplicación es una función especial de ASP.NET que no forma parte de las propias URL. En consecuencia, tratar de usar una URL con una tilde desde JavaScript no resolverá la raíz del sitio, simplemente le dará un literal ~ como puede ver.

Tendría que pasar el valor de la ruta raíz de la aplicación a JavaScript para que pueda construir las URL. No estoy familiarizado con ASP.NET, pero creo que podría hacer algo como:

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

Una forma más sencilla de hacerlo si usted sabe que hay un enlace en la página de la AppRoot sería leer la href de ese vínculo:

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

ruta relativa al archivo JS era la única solución que encontré $ .getJSON (" ../ Controlador/Acción ")

14

he utilizado esta solución con éxito

Coloque el siguiente elemento en su masterpage

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

declarar una variable global en su principal archivo javascript

var baseUrl = ""; 

Conjunto baseUrl al valor de "HiddenCurrentUrl" cuando se carga su javascript

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

Uso baseUrl

$.getJSON(baseUrl + "Action") 

EDITAR mejorada solución

En su controlador

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

En su página maestra

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

Use su baseUrl

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

Estoy marcando esto como la respuesta, ya que es funky, y me gustan las mezclas originales de jQuery y MVC. Aunque podría usar algo diferente a usar Url.Action ya que la subcadena no está tan limpia – Dann

+0

¡Estupendamente que esto te ha sido útil! No estoy satisfecho con la solución Url.Action así que por favor dígame cómo termina resolviéndola. Odio las cosas de URL. Siempre hay problemas entre entornos dev/test/prod. – Andreas

+0

Yo voté también. Es funky, pero no puedo pensar en una solución más elegante en este momento y esto funciona ... inteligente. –

4

Otra forma de obtener una URL base es

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

Por ejemplo, si ejecuta la aplicación de somename directorio virtual a continuación window.g_baseUrl voluntad variables ser igual a /SomeName/

El beneficio de este método es una posibilidad de llamar a las acciones de los otros controladores como tal

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

Sé que esta pregunta es muy antigua, pero yo estaba últimamente luchando con este tema y fue capaz de resolverlo a través de

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

esto funciona muy bien en mi llamada AJAX ...

0

es demasiado tarde para responder esta pregunta.Pero puede ser útil para alguien ya que tuve el mismo problema. En lugar de seguir todos estos pasos mencionados en las respuestas anteriores, es mejor utilizar

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

Generará la url /VIRDIR/controller/action si se está ejecutando desde el directorio virtual o genera /controller/action en otro caso.

Cuestiones relacionadas