Razor view engine, cómo ingresar al preprocesador (#if debug)

234

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?

mamu
fuente
posible duplicado de stackoverflow.com/questions/378982/…
Handcraftsman
10
Mi punto es que quieres #if debugafeitarse, 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.
Buildstarted
44
@mamu, ¿puedes aceptar esa respuesta y aceptar la de Shawn?
user247702

Respuestas:

370

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.

Shawn Wildermuth
fuente
32
Por supuesto, este método de extensión tiene que ir al proyecto MVC, no a una biblioteca separada que pueda compilarse con diferentes opciones ...
Eric J.
2
Esto no funcionó para mí en absoluto, produjo "True" independientemente del modo de compilación. La respuesta de Jordan Gray funcionó perfectamente.
Timothy Kanski
Si es el modo DEPURACIÓN, el preprocesador esencialmente leerá public static bool IsDebug(...){ return true; }, y viceversa para el modo sin DEPURACIÓN.
facepalm42
300

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).


Nota al margen: NullReferenceExceptionparaHttpContext.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.Currentse 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 nullvalor 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.

Jordan Gray
fuente
2
Tiene la ventaja de que puede activarlo en entornos de prueba de integración para diagnosticar problemas de implementación que a menudo no se ven hasta que se instalan en PC que no son desarrolladores.
Tony Wall
2
Obtengo una excepción de referencia nula al usar esto, probablemente porque en modo Release el atributo de depuración se elimina por completo de web.config.
Alex Angas
1
@AlexAngas no puede reprobar. :( System.WebCreé un proyecto en .NET 4.5.1 (ASP.NET MVC 5, versión 4.0.0.0), e incluso con el debugatributo (o, de hecho, todo el compilationelemento) 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.Webensamblaje 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?
Jordan Gray
44
@JordanGray Gracias por echar un vistazo. ¡También probé un nuevo proyecto y tampoco puedo reprobarlo! Tu solución está funcionando. Desafortunadamente, no hay tiempo para buscar más por el momento, pero si encuentro el motivo, actualizaré esta publicación.
Alex Angas
55
Sangriento compañero brillante; Esta debería ser la respuesta de los OP.
nocarrier
23

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.

Comenzó
fuente
27
Tenga en cuenta que debido a que las vistas de Razor siempre se compilan en modo de depuración, establecer una directiva de preprocesador de esta manera no tendrá ningún efecto. Siempre ejecutarás// your debug stuff
marcind
1
Je, sí, me di cuenta de eso cuando lo escribí.
Buildstarted
14

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.IsLocalpropiedad 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">
}
Sbu
fuente
1
No necesariamente. Es posible que se ejecute en modo de depuración en un servidor de prueba / desarrollo, por ejemplo, antes de compilar en modo de lanzamiento en Puesta en escena / Producción.
jonnybot
Un método de extensión de ayuda html para representar la etiqueta de enlace ayudará en este caso. Dentro del método de extensión puede usar #if DEBUG o una variable de configuración para decidir el entorno.
sree
6

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>
}
Tedebus
fuente
En mi humilde opinión, no es tan estúpido. en depuración, quiero usar el javascript es6 (por lo que veo los errores es6 durante el desarrollo) y en la versión quiero usar el javascript no es6 convertido automáticamente (porque IE11 no sabe es6). Esta es una gran solución para mí.
Matthias Burger el
¡Gracias Matías!
tedebus
agradable - simple directo, inequívoco
Serexx
5

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:

  1. Haga clic derecho en su proyecto en Visual Studio
  2. Descargar proyecto
  3. Editar proyecto

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
}
Yannick Richard
fuente
3

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>
} 
Matheus Fernandes Amorim
fuente
3

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
    }
Perry Armstrong
fuente
2

En .NET Core, puede hacer lo siguiente en lugar de verificar las variables del preprocesador:

<environment include="Development">
  <!--Debug code here-->
</environment>
Beleester
fuente