asp.net mvc - net - Razor view engine, cómo ingresar al preprocesador(#if debug)
razor mvc (6)
Estoy escribiendo mi primera página de afeitar hoy, no puedo averiguar cómo ingresar #if debug #else #endif
¿Cómo puedo introducir 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
}
Entonces 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>
Dado que el ayudante está compilado con el símbolo DEBUG / RELEASE, funciona.
Esto está integrado en HttpContext
:
@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. (Ver el comentario del Jefe de Código abajo.)
Nota al NullReferenceException
: NullReferenceException
para HttpContext.Current
Alex Angas mencionó que obtuvieron una NullReferenceException
con esta solución, y algunas personas han votado de manera ascendente, lo que indica que esto puede no ser un evento aislado.
Mi mejor conjetura: 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 subproceso diferente (¿quizás algunas soluciones para vistas precompiladas?) Obtendría un valor null
para HttpContext.Current
.
Si recibe este error, hágamelo saber en los comentarios y mencione si está utilizando vistas precompiladas o cualquier configuración especial que podría resultar en que sus vistas se rendericen / ejecuten parcialmente en otro hilo.
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>
}
Por defecto, las vistas de 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 de IF DEBUG, necesita:
- Haga clic derecho en su proyecto en Visual Studio
- Descargar proyecto
- Editar proyecto
cambia el siguiente atributo de falso a verdadero
<MvcBuildViews>true</MvcBuildViews>
Vuelve a cargar tu proyecto y luego las vistas serán compiladas.
El único trabajo alternativo 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
}
Sé que esta no es una respuesta directa a la pregunta, pero como estoy bastante seguro de que la configuración de la depuración es un corolario al hecho de que en realidad se está ejecutando localmente, siempre puede usar la propiedad Request.IsLocal
como una prueba similar a la de la 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">
}
C # y ASP.NET MVC: usar 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.