tutorial teachers net mvc minification bundling asp and javascript jquery asp.net-mvc virtual-directory

javascript - teachers - bundling asp net mvc



Javascript en el directorio virtual que no conoce el directorio virtual (8)

El acceso directo de tilde para la ruta de la raíz de la aplicación es una característica especial de ASP.NET, que no forma parte de las URL en sí. Por lo tanto, tratar de usar una URL con una tilde en JavaScript no resolverá la raíz del sitio, solo le dará un literal ~ como puede ver.

Necesitaría pasar el valor de la ruta de la raíz de la aplicación a JavaScript para que pueda construir direcciones URL por sí mismo. No estoy muy familiarizado con ASP.NET pero creo que podrías 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 sabe que hay un enlace en la página con el mensaje apropiado sería leer el href de ese enlace:

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

Digamos que tengo el sitio http://localhost/virtual donde virtual es el directorio virtual

Tengo una solicitud Ajax que está definida en un archivo javascript usando JQuery

$.getJSON("/Controller/Action")

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

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

Debería (si fuera para hacer lo que yo quería) resolver en http://localhost/virtual/Controller/Action

¿Alguna idea sobre cómo solucionar este problema?


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

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

/VIRDIR/controller/action url /VIRDIR/controller/action si se ejecuta desde el directorio virtual o genera /controller/action en otro caso.


La ruta relativa al archivo JS fue la única solución que encontré $ .getJSON ("../ Controller / Action")


La sugerencia de Aku de arriba parecía correcta, pero no quería trabajar para mí. Finalmente me di cuenta de usarlo así.

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

y luego en mi JavaScript lo uso así

config.contextPath + ''myAppPath ".

Entonces, en caso de que no haya un directorio virtual, esto resuelve en "/" + "myAppPath" y en el caso de un directorio virtual, esto resuelve en "/ VirtualPath /" + + "myAppPath"

Y esto finalmente funcionó para mí.


Otra forma de obtener una base url es

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

Por ejemplo, si ejecuta su aplicación desde el directorio virtual SomeName, la variable window.g_baseUrl será igual a / SomeName /

El beneficio de este método es la capacidad de invocar acciones en otros controladores como tal.

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


Sé que esta pregunta es muy antigua, pero últimamente tuve problemas con este problema y pude resolverlo utilizando

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

esto funciona muy bien en mi llamada ajax ...


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


Usé esta solución con éxito

Coloque el siguiente elemento en su página maestra

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

Declara una variable global en tu archivo javascript principal

var baseUrl = "";

Establezca baseUrl en el valor de "HiddenCurrentUrl" cuando se carga su javascript

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

Utilizar baseUrl

$.getJSON(baseUrl + "Action")

EDITAR Solución mejorada

En tu mando

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

En tu página principal

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

Usa tu baseUrl

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