2011-02-23 11 views
14

bien, tengo un archivo JavaScript con las siguientes funciones:Problemas ruta relativa en Javascript Ajax llamar

function AskReason() { 
    var answer = prompt("Please enter a reason for this action:", ""); 
    if (answer != null) 
     DoReason(answer); 
} 

function createXMLHttpRequest() { 
    try { 
     return new XMLHttpRequest(); 
    } 
    catch (e) 
    { alert('XMLHttpRequest not working'); } 
    try { 
     return new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { alert('Msxml2.XMLHTT not working'); } 
    try { 
     return new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    catch (e) 
    { alert('Microsoft.XMLHTTP not working'); } 
    alert("XMLHttpRequest not supported"); 
    return null; 
} 

function DoReason(reason) { 
    var xmlHttpReq = createXMLHttpRequest(); 
    var url = "/Shared/AskReason.ashx?REASON=" + reason; 
    xmlHttpReq.open("GET", url, true); 
    xmlHttpReq.send(null); 
} 

Esta línea:

var url = "/Shared/AskReason.ashx?REASON=" + reason; 

es lo que está causando el problema.

En VS 2010 depuración de la aplicación: esta llamada funciona para mi manejador de ashx.

Cuando mover el proyecto a un directorio virtual - ejemplo http://localhost/myapp

este código se romperá y tengo que cambiar el javascript para esto:

var url = "http://localhost/myapp/Shared/AskReason.ashx?REASON=" + reason;

¿Alguna idea sobre cómo puedo solucionar esto para trabajar en ambos entornos o simplemente aceptar el cambio manual cuando implemento aplicaciones en los servidores?

Gracias, Mike

+1

No es una solución, buscaré más en un minuto, pero es una muy mala idea rodar tu propio método AJAX [por razones de seguridad entre otros] - mira una biblioteca como prototipo o jQuery. O bien, dado que está utilizando .NET, use las bibliotecas integradas (que son jQuery efectivamente) – iivel

Respuesta

18

Pointy's way funciona, pero debe saber de antemano dónde lo va a desplegar.

Como alternativa, simplemente no iniciar la ruta relativa con un /:

var url = "Shared/AskReason.ashx?REASON=" + reason; 

que se resolverá con respecto a la ubicación del documento actual. Así que si el documento actual es:

http://localhost/myapp/index.aspx 

... a continuación, que se resolverá a

http://localhost/myapp/Shared/AskReason.ashx?REASON=foo 
+0

Esto no funciona para mí porque la página actual que llama al JS está en una subcarpeta ... pero si todo estaba en el mismo carpeta funcionaria! – MDV2000

+5

@ MDV2000: Aún puede usar rutas relativas en su estructura. Por ejemplo, si la fuente es 'http: // localhost/myapp/subfolder/index.aspx', puede usar' ../ Shared/AskReason.ashx' para obtener 'http: // localhost/myapp/Shared/AskReason.ashx'. Múltiples '../../' están bien también. Recomiendo mantener todas las rutas dentro de la aplicación relativa en lugar de "rootear". –

+0

De hecho, encontré otra forma. En mi código ASP.NET detrás, configuro OnClientClick del botón a mi método JS. Agregué un parámetro al método y paso el nombre del servidor URL + directorio virtual y así en el código JS solo concateno el valor del parámetro a la url para obtener la ruta que quiero. – MDV2000

5

caminos que comienzan con un (y ningún protocolo de acogida &) "/" son relativas a la raíz del huésped. Si despliega tal que su aplicación está en "http: // whatever/myapp", entonces sus rutas relativas a la raíz tienen que comenzar con "/ myapp".

Cuando trabaja en un entorno de servidor que implica algún tipo de mecanismo de plantilla de página, un truco común es tener esa parte de la ruta como un tipo de variable de configuración para que pueda escribir páginas con rutas como :

<a href='${root}/something/something'>click me</a> 

Luego esa variable "raíz" se expande según la configuración de "/ myapp" o lo que sea.

2

La url

 
var url = "/Shared/AskReason.ashx?REASON=" + reason; 

está buscando el archivo en el directorio raíz [ya que es una ruta absoluta], efectivamente

 
http://localhost/Shared/AskReason.ashx 

Debe incluir el nombre del directorio virtual O determinar la estructura adecuada:

Comenzar sin/le dará una ruta relativa ... si necesita navegar por los directorios, use ../ Compartido/estilo de notación, o finalmente use su comando de directorio de servidores para determinar su ruta actual.

+0

Agregué lo virtual en la ruta, y aún así no funcionó ... hmmm .... – MDV2000

2

Tuve un problema similar cuando se necesitaba una URL absoluta, pero la referencia se rompió al pasar de un servidor local al de producción. Lo resolví comprobando si existe una cadena "localhost" en:

var environ = window.location.host; 

Entonces sólo puede hacer:

if (environ === "localhost") { 
    var baseurl = window.location.protocol + "//" + window.location.host + "/" + "shared/"; 
} else { 
    var baseurl = window.location.protocol + "//" + window.location.host + "/"; 
} 

continuación, puede añadir baseurl frente a cualquier URL que necesita hacer referencia.