web-dev-qa-db-fra.com

Moteur de vue rasoir, comment entrer dans le préprocesseur (#if debug)

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?

220
mamu

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.

358
Shawn Wildermuth

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


Note latérale: 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!

285
Jordan Gray

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.

23
Buildstarted

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">
}
14
Simon Budin

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:

  1. Faites un clic droit sur votre projet dans Visual Studio
  2. Décharger le projet
  3. Editer le projet

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
}
5
Yannick Richard

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