265 votes

Directives de préprocesseur dans Razor

J'écris ma première page Razor aujourd'hui, et je n'arrive pas à trouver comment entrer.

#if debug
...
#else
...
#endif

Comment puis-je faire cela dans Razor ?

0 votes

Duplication possible de stackoverflow.com/questions/378982/

11 votes

Ce que je veux dire, c'est que vous voulez #if debug en rasoir mais il toujours être vrai. La réponse à votre question est donc qu'il n'y a aucun intérêt à le faire car Razor compilera toujours en mode débogage.

410voto

Shawn Wildermuth Points 3259

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 je l'ai utilisé dans mes vues comme ça :

<section id="sidebar">
     @Html.Partial("_Connect")
     @if (!Html.IsDebug())
     { 
         @Html.Partial("_Ads")
     }
     <hr />
     @RenderSection("Sidebar", required: false)
</section>

Comme l'aide est compilée avec le symbole DEBUG/RELEASE, elle fonctionne.

36 votes

Bien sûr, cette méthode d'extension doit être intégrée au projet MVC, et non à une bibliothèque séparée qui pourrait être compilée avec différentes options...

3 votes

Cela n'a pas fonctionné pour moi du tout - il a produit "True" indépendamment du mode de compilation. La réponse de Jordan Gray a parfaitement fonctionné.

0 votes

Si c'est en mode DEBUG, le pré-processeur lira essentiellement public static bool IsDebug(...){ return true; } et vice versa pour le mode non DEBUG.

326voto

Jordan Gray Points 5441

C'est intégré dans HttpContext :

@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Means that debug="true" in Web.config
}

IMO, cela a plus de sens que la compilation conditionnelle pour les vues et s'avère pratique pour certains scénarios de test. (Voir Commentaire de Tony Wall ci-dessous).


Note complémentaire : NullReferenceException para HttpContext.Current

Alex Angas a mentionné qu'ils obtiennent un NullReferenceException avec cette solution, et quelques personnes ont upvoted indiquant que ce n'est peut-être pas un événement isolé.

Ma meilleure supposition : HttpContext.Current est stocké dans CallContext Il n'est donc accessible que par le thread qui traite 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 un message d'erreur null valeur pour HttpContext.Current .

Si vous obtenez cette erreur, merci de me le faire savoir dans les commentaires et de mentionner si vous utilisez des vues précompilées ou toute autre configuration spéciale qui pourrait faire que vos vues soient partiellement rendues/exécutées sur un autre thread !

2 votes

Il présente l'avantage de pouvoir être activé dans des environnements de test d'intégration afin de diagnostiquer les problèmes de déploiement qui ne sont souvent pas visibles avant d'être installés sur des PC de non-développeurs.

2 votes

J'obtiens une exception de référence nulle en utilisant cette méthode, probablement parce qu'en mode Release, l'attribut de débogage est entièrement supprimé du web.config.

0 votes

@AlexAngas Eugh, c'est extrêmement désagréable - merci de l'avoir mentionné. Je vais essayer d'obtenir une reproduction plus tard et mettre à jour ma réponse. S'il jette une exception, je le signalerai comme un bogue du framework - il devrait retourner false plutôt que de jeter une exception si l'attribut n'est pas présent !

52voto

takepara Points 5965
@{
  #if DEBUG
     // your content
  #else
     // your content
  #endif
}

J'espère que cela vous aidera.

Désolé ! Ce code est toujours DEBUG.

J'avais tort.

et l'approche du modèle recommandé.

en cas d'utilisation uniquement Web, référence à la propriété HttpContext.Current.IsDebuggingEnabled.

24voto

BuildStarted Points 15931

C# et ASP.NET MVC : Utilisation de la directive #if dans une vue

En fait, cette réponse a la bonne réponse. Vous allez devoir passer si vous êtes en mode débogage ou non via le Model. (ou ViewBag) puisque toutes les vues sont compilées en mode débogage.

27 votes

Notez que, comme les vues Razor sont toujours compilées en mode Debug, le fait de définir une directive de préprocesseur de cette manière n'aura aucun effet. Vous exécuterez toujours // your debug stuff

1 votes

Heh, ouais, je viens de réaliser ça quand je l'ai écrit.

5voto

Yannick Richard Points 96

Par défaut, les vues MVC ne sont pas compilées, donc #IF DEBUG ne peut pas fonctionner dans une vue. Si vous voulez compiler la vue afin d'accéder à la configuration IF DEBUG, vous devez :

  1. Cliquez avec le bouton droit de la souris sur votre projet dans Visual Studio
  2. Décharger le projet
  3. Modifier le projet

changer l'attribut suivant de false à true

<MvcBuildViews>true</MvcBuildViews>

rechargez votre projet et les vues vont être compilées.

La seule autre solution 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;
}

et ensuite l'appeler depuis la vue :

if(DEBUG())
{
  //debug code here
}
else
{
  //release code here
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X