statement mvc else cshtml c# asp.net-mvc conditional debug-symbols

c# - mvc - razor html



C#y ASP.NET MVC: uso de la directiva#if en una vista (7)

En tu 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> <% } %>

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.

Mi código de vista se ve así (abreviado un poco para propósitos 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 símbolo RELEASE establecido, se está ejecutando el código ''else'' y obtengo 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 presentaré en 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 lo presenta como una vista parcial a través de:

Html.RenderPartial("BannerView");

no funciona.


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 }


Una solución mejor y más genérica es usar un método de extensión, para que todas las vistas tengan acceso a él:

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

Luego puede usarlo de la siguiente manera en cualquier vista (sintaxis de la afeitadora):

@if(Html.IsReleaseBuild()) ...


Recientemente descubrí que puedes simplemente probar:

HttpContext.Current.IsDebuggingEnabled

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


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


Puedes usar ViewBag en lugar de viewmodel (pero el enfoque de viewmodel es mejor):

Controlador :

Vista:

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

Uso:

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

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


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> }