J'écris ma première page de rasoir aujourd'hui, je ne peux pas comprendre comment entrer #if debug #else #endif
Comment puis-je entrer préprocesseur en rasoir?
Je viens de créer une méthode d'extension:
public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
return true;
#else
return false;
#endif
}
Puis utilisé dans mes vues comme suit:
<section id="sidebar">
@Html.Partial("_Connect")
@if (!Html.IsDebug())
{
@Html.Partial("_Ads")
}
<hr />
@RenderSection("Sidebar", required: false)
</section>
Puisque l’assistant est compilé avec le symbole DEBUG/RELEASE, cela fonctionne.
Ceci est intégré à HttpContext
:
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
OMI, cela a plus de sens que la compilation conditionnelle pour les vues et est pratique pour certains scénarios de test. (Voir commentaire du chef de code ci-dessous.)
NullReferenceException
pour HttpContext.Current
Alex Angas a mentionné qu'ils obtiennent un NullReferenceException
avec cette solution, et quelques personnes ont voté en faveur, indiquant qu'il ne s'agissait peut-être pas d'un événement isolé.
Ma meilleure hypothèse: HttpContext.Current
est stocké dans CallContext
, ce qui signifie qu'il n'est accessible que par le thread qui gère la requête HTTP entrante. Si vos vues sont rendues sur un autre thread (peut-être des solutions pour les vues précompilées?), Vous obtiendrez une valeur null
pour HttpContext.Current
.
Si vous rencontrez cette erreur, merci de me le faire savoir dans les commentaires et d'indiquer si vous utilisez des vues précompilées ou toute autre configuration spéciale pouvant entraîner le rendu/l'exécution partiel de vos vues sur un autre thread!
C # et ASP.NET MVC: utilisation de la directive #if dans une vue
En fait, cette réponse a la bonne réponse. Vous devrez passer si vous êtes ou non en mode débogage via le modèle. (ou ViewBag) puisque toutes les vues sont compilées en mode débogage.
Je sais que ce n’est pas une réponse directe à la question, mais comme je suis presque sûr que la configuration de débogage est corollaire au fait que vous exécutez réellement au niveau local, vous pouvez toujours utiliser le Request.IsLocal
propriété comme un débogage comme test. Ainsi :
@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">
}
Par défaut, les vues MVC ne sont pas compilées. Par conséquent, #IF DEBUG ne peut pas fonctionner dans une vue. Si vous souhaitez compiler la vue afin d'accéder à IF DEBUG config, vous devez:
changer l'attribut suivant de faux à vrai
<MvcBuildViews>true</MvcBuildViews>
rechargez votre projet, puis les vues seront compilées.
Le seul autre moyen de contourner le problème serait d’avoir une fonction dans votre code derrière
public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
var value = false;
#if(DEBUG)
value=true;
#endif
return value;
}
puis appelez-le de vue:
if(DEBUG())
{
//debug code here
}
else
{
//release code here
}
Pour moi, le code ci-dessous a très bien fonctionné.
Lorsque l'application est débogage, mes boutons apparaissent, quand Release, ils ne le sont pas.
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}
Ma solution est très stupide, mais ça marche. Définissez une constante globale quelque part dans un fichier statique:
public static class AppConstants
{
#if DEBUG
public const bool IS_DEBUG = true;
#else
public const bool IS_DEBUG = false;
#endif
}
Puis utilisez-le avec Razor en HTML:
@if (AppConstants.IS_DEBUG)
{
<h3>Debug mode</h3>
}
else
{
<h3>Release mode</h3>
}