2010-01-20 14 views
11

Tengo una página maestra que está en/Vistas/Compartida. La página maestra hace referencia a una hoja de estilo en la carpeta /Content.ASP.NET MVC - Hacer referencia a hojas de estilo en la página maestra

Todo funciona bien si hago referencia a la hoja de estilo usando "../../Content/style.css". Sin embargo, mi aplicación web no está en la carpeta raíz en nuestro entorno de producción, por lo que la ruta relativa no funciona.

He intentado "<% = ResolveUrl (" ~/content/style.css ")%>" que funciona en el escenario de producción, pero luego el diseñador en Visual Studio se queja de que mis clases estaban equivocadas (y yo no se puede obtener una vista previa de la página con CSS en la pestaña de diseño).

¿Existe alguna solución que lo haga funcionar en ambas situaciones? Logré esto en WebForms escribiendo un código del lado del servidor que restablecía la etiqueta de enlace. Podría hacer eso aquí, pero me gustaría evitarlo.

+0

* "mi aplicación web no está en la carpeta raíz" * ... Una ruta relativa no hace referencia a la carpeta raíz, por lo que no estoy seguro de por qué esto podría importar. ¿Estás seguro de que tu carpeta de Contenido está en la misma ubicación ** relativa ** en el servidor de producción? –

+0

La ruta relativa es la misma en producción y desarrollo. La ruta relativa es correcta cuando es relativa a la página maestra. Sin embargo, la ruta no es relativa a la página que usa la página maestra, que es la ruta que usa el navegador del usuario. –

Respuesta

8

Pruebe esta técnica - incluya su hoja de estilo ambas maneras. Incluya uno con una referencia de ruta fija que Visual Studio utilizará para el soporte de tiempo de diseño, pero encerrelo en los comentarios del lado del servidor para que no esté realmente incluido durante el tiempo de ejecución. La segunda referencia es la referencia "real" utilizada en el tiempo de ejecución, y con Url.Content() funcionará tanto si su aplicación es un subdirectorio como si no.

<% /* %> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
<% */ %> 

<link href="<%=Url.Content("~/Content/Site.css") %>" rel="stylesheet" 
     type="text/css" /> 
+0

+1 ¡Técnica interesante! Yo usaría T4MVC para hacer esto también. –

+0

Me gusta esta idea. Es un trabajo alternativo, pero cumple con ambos requisitos. Sería bueno si el diseñador de ASPX analizaría el código del lado del servidor al obtener una vista previa de la página. –

+0

También puede hacer que el enlace estático runat = "server" visible = "false", que es algo más simple. –

6

Es la mejor práctica para Extend the URL Helper. Esto le permite llamarlo fácilmente desde su vista, y si su estructura o archivos cambian, no necesita hacer un hallazgo/reemplazo masivo.

public static string Image(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Images/" + fileName)); 
} 

public static string Stylesheet(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Stylesheets/" + fileName); 
} 

public static string Script(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Scripts/" + fileName); 
} 

    <link href="<%= UrlHelper.Stylesheet("Main.css")%>" rel="stylesheet" 
     type="text/css" /> 
+0

¿Por qué es esta una mejor práctica? –

+0

para que pueda referirlo fácilmente a su vista, y si alguno de ellos cambia, no tiene que buscar/reemplazar. – Martin

+0

Entiendo su punto, pero no resuelve el problema de que el diseñador de VS no resuelva la ubicación de CSS. –

0

En la carpeta Vistas y luego yendo a la carpeta compartida ayuda a comprender cómo se hace referencia al archivo CSS en el MVC.

Cuestiones relacionadas