En mis aplicaciones, a menudo tengo que usar rutas relativas. Por ejemplo, cuando hago referencia a JQuery, generalmente lo hago así:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Ahora que estoy haciendo la transición a MVC, necesito tener en cuenta las diferentes rutas que puede tener una página, en relación con la raíz. Por supuesto, esto fue un problema con la reescritura de URL en el pasado, pero me las arreglé para solucionarlo utilizando rutas consistentes.
Soy consciente de que la solución estándar es usar rutas absolutas como:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
pero esto no funcionará para mí, ya que durante el ciclo de desarrollo, tengo que implementarlo en una máquina de prueba en la que la aplicación se ejecutará en un directorio virtual. Las rutas relativas a la raíz no funcionan cuando cambia la raíz. Además, por razones de mantenimiento, no puedo simplemente cambiar todas las rutas durante la implementación de la prueba, eso sería una pesadilla en sí mismo.
Entonces, ¿cuál es la mejor solución?
Editar:
Dado que esta pregunta aún recibe vistas y respuestas, pensé que sería prudente actualizarla para tener en cuenta que a partir de Razor V2, el soporte para URL relativas a la raíz está integrado, por lo que puede usar
<img src="~/Content/MyImage.jpg">
sin ninguna sintaxis del lado del servidor, y el motor de visualización reemplaza automáticamente ~ / con la raíz del sitio actual.
fuente
Si bien es una publicación antigua, los nuevos lectores deben saber que Razor 2 y posterior (predeterminado en MVC4 +) resuelve completamente este problema.
Antiguo MVC3 con Razor 1:
Nuevo MVC4 con Razor 2 y posterior:
Sin una sintaxis incómoda similar a una función de Razor. Sin etiquetas de marcado no estándar.
Prefijar una ruta en cualquier atributo HTML con una tilde ('~') le dice a Razor 2 que "simplemente haga que funcione" sustituyendo la ruta correcta. Es genial.
fuente
Rompiendo el cambio - MVC 5
Tenga cuidado con un cambio importante en MVC 5 (de las notas de la versión de MVC 5 )
En realidad, no explican cómo hacerlo, pero luego encontré esta respuesta :
Nota: Es posible que desee verificar primero que
Request.ServerVariables
contiene realmenteIIS_WasUrlRewritten
para asegurarse de que este es su problema.PD. Pensé que tenía una situación en la que esto me estaba sucediendo y estaba
src="~/content/..."
generando URLS en mi HTML, pero resultó que algo simplemente no se actualizaba cuando se estaba compilando mi código. Editar y volver a guardar los archivos cshtml de diseño y página de alguna manera hizo que algo funcionara.fuente
En ASP.NET suelo utilizar
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. No veo por qué una solución similar no debería funcionar en ASP.NET MVC.fuente
Es lo que usé. Cambie la ruta para que coincida con su ejemplo.
fuente
Por lo que vale, realmente odio la idea de ensuciar mi aplicación con etiquetas de servidor solo para resolver rutas, así que investigué un poco más y opté por usar algo que había probado antes para reescribir enlaces: un filtro de respuesta. De esta manera, puedo prefijar todas las rutas absolutas con un prefijo conocido y reemplazarlo en tiempo de ejecución usando el objeto Response.Filter y no tener que preocuparme por etiquetas de servidor innecesarias. El código se publica a continuación en caso de que ayude a alguien más.
fuente
El motor de vista de Razor para MVC 3 hace que sea aún más fácil y limpio el uso de rutas relativas de raíz virtual que se resuelven correctamente en tiempo de ejecución. Simplemente suelte el método Url.Content () en el valor del atributo href y se resolverá correctamente.
fuente
Al igual que Chris, realmente no puedo soportar tener que poner etiquetas hinchadas del lado del servidor dentro de mi marcado limpio solo para decirle a la estúpida cosa que mire desde la raíz hacia arriba. Eso debería ser algo muy simple y razonable de pedir. Pero también odio la idea de tener que hacer el esfuerzo de escribir cualquier clase de C # personalizada para hacer algo tan simple, ¿por qué debería tener que hacerlo? Que perdida de tiempo.
Para mí, simplemente me comprometí con la "perfección" y codifiqué el nombre de la ruta raíz del directorio virtual dentro de mis referencias de ruta. Así que así:
No se requiere procesamiento del lado del servidor o código C # para resolver la URL, que es lo mejor para el rendimiento, aunque sé que sería insignificante independientemente. Y no hay un caos feo e inflado del lado del servidor en mi bonito marcado limpio.
Solo tendré que vivir sabiendo que esto está codificado y deberá eliminarse cuando la cosa migre a un dominio adecuado en lugar de http: // MyDevServer / MyProject /
Salud
fuente
Tarde para el juego, pero esta publicación tiene un resumen muy completo del manejo de las rutas ASP.Net.
fuente
Utilizo un método de ayuda simple. Puede usarlo fácilmente en Vistas y Controladores.
Margen:
Método de ayuda:
fuente
Fui con un enfoque un poco diferente basado en una publicación SO similar, pero con mucho menos código ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
fuente