2009-05-28 59 views
16

Estoy cargando un poco de contenido a través de jQuery.load ('/ Business/Tags'), que funciona bien cuando uso mi servidor web local. Pero cuando se usa iis, esto no se resuelve correctamente. He visto un par de formas diferentes de evitar esto, como ResolveUrl. ¿Cuál es la mejor manera de manejar URL de resolución en su javascript?ASP.NET MVC resolve urls en javascript

Respuesta

18

Me encontré con este problema exacto con mi JavaScript. Como mi JavaScript también estaba en un archivo separado que se incluyó en mi página maestra, no pude usar ResolveUrl en mi caso.

Así es como lo resolví en mi caso. Incluí el siguiente JavaScript en mi etiqueta de la cabeza en mi página maestra en la parte superior:

<script type="text/javascript"> 
    var baseUrl = "<%= Request.Url.GetLeftPart(UriPartial.Authority) %>"; 
</script> 

Soy la creación de una variable global que se puede acceder a todos los archivos de JavaScript llamada baseUrl.

Su código se convertiría entonces en:

jQuery.load(baseUrl + '/Business/Tags'); 
+0

Intenté este método pero no estoy obteniendo todo lo que necesito, pero creo que puedo trabajar con él.Recibo una cadena como esta "http: // mtsengv003 /" pero necesito una como esta "http: // mtsengv003/MVC /" Gracias –

+5

Creo que es mejor usar: var baseUrl = "<% = Solicitud .Url.GetLeftPart (UriPartial.Authority) + Request.ApplicationPath.TrimEnd ('/')%> "; –

+0

@ eu-ge-ne: Gracias por señalar eso. Mi memoria no es lo que solía ser. Tu código es perfecto –

5

En cuanto a mí estoy usando ayudantes Url.Action/Url.RouteUrl con JavaScript/jQuery donde es posible:

$.load('<%= Url.Action("Tags", "Business") %>') 

o

$.load('<%= Url.RouteUrl("BusinessTagsRoute") %>') 

En otros casos que estoy usando ayudante ResolveUrl (de MVCContrib o su podría escribir su propio):

$.load('<%= Url.ResolveUrl("~/Business/Tags") %>') 

Actualizado:

También es posible crear controlador especial para su JavaScript/jQuery con acciones, volviendo PartialViews con JavaScript:

public ActionResult YourJavaScript() 
{ 
    Response.ContentType = "application/x-javascript"; 
    return PartialView("YourJavaScript"); 
} 

Luego, en el que YourJavaScript.ascx puede usar código JavaScript/jQuery con etiquetas de servidor WebForms. Todavía recomiendo no usar Urls difícilmente codificadas en jQuery/AJAX

+1

Si coloca todo su JavaScript en un archivo separado y luego referencia este archivo usando Url.Content en su página Maestra, Url.ResolveUrl no funcionará dentro de su JavaScript. Alguien por favor corrígeme si me equivoco sobre esto. –

1

Todavía recomiendo usar la etiqueta href base en su página maestra. por lo tanto, cualquier imagen o llamada de JavaScript se resolverá a partir de esta url. Esto le permitirá colocar sus funciones/llamadas de javascript en un archivo js externo.

 
<html> 
    <head> 
     <base href="http://www.mysite.com/virtual_dir1/"> 
     <script src="location_of_js_file"> 

Recuerde la terminación '/' en la base href.

Además, elimine el '/' inicial y siempre que haga jQuery.load ('Business/Tags'), en realidad vendrá de http://www.mysite.com/virtual_dir1/Business/Tags.

+0

Realmente me gusta este enfoque. Tan limpio y requiere tan poco esfuerzo. Gracias – lomaxx

+0

Este es definitivamente un enfoque pragmático al problema, pero usar ['base'] (http://www.w3.org/TR/REC-html40/struct/links.html#h-12.4) de esta manera es incorrecto. Base HREF solo debe usarse para resolver los URI relativos a la página actual en la que se encuentra. Al establecer 'base' de esta manera ** todos los URI relativos ** en esta página apuntarán a' http: // www.misitio.com/virtual_dir1/'. – ahsteele

2

un par de maneras en que lo hacemos en nuestras aplicaciones:

var applicationPath = '<%= Url.Content("~/") %>'; 

O

var applicationPath = '<%= Request.Url.Scheme %>://<%= Request.Url.Host %><%= Request.ApplicationPath %>/'; 

A continuación, utilizamos ApplicationPath que la URL base para todas nuestras llamadas ajax.

Cuestiones relacionadas