Hoy estoy escribiendo mi primera página de afeitar, no puedo entender cómo ingresar #if debug #else #endif
¿Como puedo ingresar el preprocesador en la maquinilla de afeitar?
Hoy estoy escribiendo mi primera página de afeitar, no puedo entender cómo ingresar #if debug #else #endif
¿Como puedo ingresar el preprocesador en la maquinilla de afeitar?
Acabo de crear un método de extensión:
public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
return true;
#else
return false;
#endif
}
Luego lo usé en mis puntos de vista así:
<section id="sidebar">
@Html.Partial("_Connect")
@if (!Html.IsDebug())
{
@Html.Partial("_Ads")
}
<hr />
@RenderSection("Sidebar", required: false)
</section>
Como el ayudante se compila con el símbolo DEPURACIÓN / LIBERACIÓN, funciona.
public static bool IsDebug(...){ return true; }
, y viceversa para el modo sin DEPURACIÓN.
Esto está integrado enHttpContext
:
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
En mi opinión, esto tiene más sentido que la compilación condicional para vistas y es útil para algunos escenarios de prueba. (Vea el comentario de Tony Wall a continuación).
NullReferenceException
paraHttpContext.Current
Alex Angas mencionó que obtienen unNullReferenceException
solución con esta solución, y algunas personas han votado a favor indicando que esto puede no ser un evento aislado.
Mi mejor suposición: HttpContext.Current
se almacena en CallContext
, lo que significa que solo es accesible por el hilo que maneja la solicitud HTTP entrante. Si sus vistas se representan en un hilo diferente (¿quizás algunas soluciones para vistas precompiladas?) Obtendría un null
valor paraHttpContext.Current
.
Si recibe este error, avíseme en los comentarios y mencione si está utilizando vistas precompiladas o cualquier configuración especial que pueda dar como resultado que sus vistas se procesen / ejecuten parcialmente en otro hilo.
System.Web
Creé un proyecto en .NET 4.5.1 (ASP.NET MVC 5, versión 4.0.0.0), e incluso con el debug
atributo (o, de hecho, todo el compilation
elemento) eliminado, no obtengo una excepción. Mi siguiente La mejor hipótesis es que este es un error que se corrigió en versiones posteriores del System.Web
ensamblaje o que hay algo diferente sobre su situación específica de lo que no estoy al tanto. ¿Podría crear un proyecto de prueba mínimo y subirlo a algún lugar?
C # y ASP.NET MVC: uso de la directiva #if en una vista
En realidad esa respuesta tiene la respuesta correcta. Tendrá que aprobar si está o no en modo de depuración a través del Modelo. (o ViewBag) ya que todas las vistas se compilan en modo de depuración.
// your debug stuff
Sé que esta no es una respuesta directa a la pregunta, pero como estoy bastante seguro de que la configuración de depuración es el corolario del hecho de que realmente se está ejecutando localmente, siempre puede usar la Request.IsLocal
propiedad como una prueba de depuración. Así:
@if (Request.IsLocal)
{
<link rel="stylesheet" type="text/css" href="~/css/compiled/complete.css">
}
else
{
<link rel="stylesheet" type="text/css" href="~/css/compiled/complete.min.css">
}
Mi solución es muy estúpida, pero funciona. Defina una constante global en algún lugar de un archivo estático:
public static class AppConstants
{
#if DEBUG
public const bool IS_DEBUG = true;
#else
public const bool IS_DEBUG = false;
#endif
}
Luego úsalo con Razor en HTML:
@if (AppConstants.IS_DEBUG)
{
<h3>Debug mode</h3>
}
else
{
<h3>Release mode</h3>
}
Por defecto, las vistas MVC no se compilan, por lo que #IF DEBUG no puede funcionar en una vista. Si desea compilar la vista para acceder a la configuración IF DEBUG, debe:
cambie el siguiente atributo de falso a verdadero
<MvcBuildViews>true</MvcBuildViews>
vuelva a cargar su proyecto y luego se compilarán las vistas.
La única otra solución sería tener una función en su código detrás
public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
var value = false;
#if(DEBUG)
value=true;
#endif
return value;
}
y luego llamarlo desde la vista:
if(DEBUG())
{
//debug code here
}
else
{
//release code here
}
Para mí, el siguiente código ha funcionado muy bien.
Cuando la aplicación está depurando , aparecen mis botones, cuando es Release , no lo hacen.
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}
Esto funciona para mí en un proyecto de marca blanca .net core 3.0
@{
#if CORPA
}
<button type="button" class="btn btn-warning">A Button</button>
@{
#else
}
<p>Nothing to see here</p>
@{
#endif
}
En .NET Core, puede hacer lo siguiente en lugar de verificar las variables del preprocesador:
<environment include="Development">
<!--Debug code here-->
</environment>
#if debug
afeitarse, pero siempre será cierto. Entonces, la respuesta a su pregunta es que no tiene sentido hacerlo, ya que Razor siempre compilará en modo de depuración.