2010-06-01 37 views
44

Tengo un símbolo de compilación condicional que estoy usando llamado "RELEASE", que indiqué en las propiedades de mi proyecto en Visual Studio. Quiero que se aplique CSS en particular a los elementos cuando se define el símbolo de LIBERACIÓN, y yo estaba tratando de hacerlo desde la vista, pero parece que no funciona.C# y ASP.NET MVC: Usando la directiva #if en una vista

Mi código de la vista se parece a esto (se ha reducido un poco para fines de demostración):

<% #if (RELEASE) %> 
    <div class="releaseBanner">Banner text here</div> 
<% #else %> 
    <div class="debugBanner">Banner text here</div> 
<% #endif %> 

Con este código, y con el conjunto de símbolos LIBERACIÓN, el código 'otra cosa' está en marcha y me estoy poniendo un div con la clase debugBanner. Entonces, no parece pensar que se haya definido RELEASE. Vale la pena señalar que mi código de C# real en archivos .cs está reconociendo LIBERACIÓN y ejecuta el código correcto. Solo la vista me está dando el problema.

¿Alguien tiene alguna idea de esto? Cualquier ayuda sería apreciada. Gracias.

Aclaración: Debería haber mencionado que esta vista ya es una vista parcial, y simplemente la renderizaré en las páginas donde la necesite. Eso es porque estos banners estarán en ciertas páginas y no en otras. Así que incluso cuando se representa como una vista parcial a través de:

Html.RenderPartial("BannerView");

que no está funcionando.

+3

¿Por qué no creas un método html helper y pones tu código allí? Puede hacer el si y hacer un render parcial para mantener el HTML – Rippo

+0

No muy familiarizado con los métodos html helper. Aclaré mi pregunta para indicar que esta es una vista parcial con la que estoy trabajando. ¿Puedes explicar un poco sobre tu sugerencia? –

+1

las directivas de preprocesador solo funcionan en tiempo de compilación ... @DeveloperArt tiene una solución elegante ... – xandercoded

Respuesta

17

En su modelo:

bool isRelease = false; 

<% #if (RELEASE) %> 
    isRelease = true; 
<% #endif %> 

En su opinión:

<% if (Model.isRelease) { %> 
    <div class="releaseBanner">Banner text here</div> 
<% } else { %> 
    <div class="debugBanner">Banner text here</div> 
<% } %> 
+0

Estoy obteniendo de esta respuesta que no es posible verificar los símbolos de compilación desde una vista, y eso se debe hacer desde un archivo .cs. ¿Es esto cierto? –

+0

Buena solución, pero ¿qué pasa si ponemos esta lógica en un controlador base que todos los controladores heredan? Entonces podría tener acceso a esta propiedad a través de todos los controladores ... – xandercoded

+1

, no estoy seguro de que funcione por completo xander. Para tener acceso desde la vista, necesitaríamos un modelo con esa propiedad, no un controlador con esa propiedad. Así que realmente tendría que pasar ese mismo modelo desde múltiples controladores y renderizar esa vista, lo que sería una especie de dolor. –

104

I recientemente descubierto que se puede simplemente prueba:

HttpContext.Current.IsDebuggingEnabled 

en Vistas, lo que le ahorra verificar símbolos en otras partes de su aplicación.

+1

Este es el mejor enfoque, IMO. –

+2

¿No debería usar 'this.Context.IsDebuggingEnabled' en su lugar? Realmente solo aplicable si se burló del contexto o de alguna manera [usó vistas de afeitar fuera de una aplicación web] (http://stackoverflow.com/questions/3628895/is-it-possible-to-use-razor-view-engine- outside-asp-net) – drzaus

-7

A continuación se muestra la sintaxis de Razor para las directivas de compilación condicional. Carga la versión de desarrollador de jquery cuando la variable DEBUG se establece en el perfil VS o web.config. De lo contrario, se carga la versión mínima.

@{#if (DEBUG) 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js"></script> 

#else 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js"></script> 
#endif 
} 
+1

¿No cree que esto funcionará ya que las vistas no se compilan y si (DEBUG) es una directiva de compilación? – Tom

+1

Eso no funciona en Razor. De eso es exactamente de lo que se trata la pregunta original. – trailmax

57

Una solución mejor, más genérico es el uso de un método de extensión, por lo que todos los puntos de vista tienen acceso a ella:

public static bool IsReleaseBuild(this HtmlHelper helper) 
{ 
#if DEBUG 
    return false; 
#else 
    return true; 
#endif 
} 

Luego, puede usarlo como sigue en cualquier vista (sintaxis de afeitar):

@if(Html.IsReleaseBuild()) 
... 
+1

¡Es un método increíble! ¡gracias por compartir! – trailmax

+1

por supuesto, la advertencia es que depende de dónde está este método: si está en una biblioteca compartida que se ha compilado en modo de lanzamiento, devolverá 'false' cuando se incluya en un proyecto compilado en modo de depuración. – drzaus

+0

Por favor, consulte esta pregunta http://stackoverflow.com/questions/28400135/public-conference-razor-views-with-minified-js-and-css – chemitaxis

9
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag 
} 
3

Se puede utilizar en lugar del modelo de vista ViewBag (pero viewmodel enfoque similar es mejor):

controlador:

controller code

Vista:

@{ 
    bool hideYoutubeVideos = ViewBag.hideYoutubeVideos ?? false;  
} 

Uso:

@if (!hideYoutubeVideos) 
{ 
    <span>hello youtube</span> 
} 

Además, asegúrese de que la variable NIKITA_DEBUG existe en la pestaña de construcción de su proyecto:

build tab

1

Para mí, el siguiente código ha funcionado muy bien. Cuando la aplicación está depurando aparecen mis botones, cuando es Release, no.

@if (this.Context.IsDebuggingEnabled) 
{ 
    <button type="button" class="btn btn-warning">Fill file</button> 
    <button type="button" class="btn btn-info">Export file</button> 
} 
Cuestiones relacionadas