Razor view engine, come inserire il preprocessore (#if debug)


234

Sto scrivendo la mia prima pagina di rasoio oggi, non riesco a capire come entrare #if debug #else #endif

Come posso inserire il preprocessore nel rasoio?



10
Il punto è che vuoi #if debugin rasoio ma sarà sempre vero. Quindi la risposta alla tua domanda è che non ha senso farlo poiché Razor si compila sempre in modalità debug.
Iniziata il

4
@mamu puoi accettare quella risposta e accettare quella di Shawn?
user247702

Risposte:


370

Ho appena creato un metodo di estensione:

public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
      return true;
#else
      return false;
#endif
}

Quindi l'ho usato nei miei punti di vista in questo modo:

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

Poiché l'helper è compilato con il simbolo DEBUG / RELEASE, funziona.


32
Ovviamente questo metodo di estensione deve andare nel progetto MVC, non in una libreria separata che potrebbe essere compilata con diverse opzioni ...
Eric J.

2
Questo non ha funzionato affatto per me, ma ha prodotto "True" indipendentemente dalla modalità di compilazione. La risposta di Jordan Gray ha funzionato perfettamente.
Timothy Kanski,

Se è la modalità DEBUG, il pre-processore leggerà essenzialmente public static bool IsDebug(...){ return true; }e viceversa per la modalità non DEBUG.
facepalm42,

300

Questo è integrato perHttpContext :

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

IMO, questo ha più senso della compilazione condizionale per le viste ed è utile per alcuni scenari di test. (Vedi il commento di Tony Wall di seguito.)


Nota a margine: NullReferenceExceptionperHttpContext.Current

Alex Angas ha detto che ottengono una NullReferenceExceptionsoluzione con questa soluzione e alcune persone hanno votato per indicare che questo potrebbe non essere un evento isolato.

La mia migliore ipotesi: HttpContext.Currentè archiviato CallContext, nel senso che è accessibile solo dal thread che gestisce la richiesta HTTP in arrivo. Se le tue viste vengono visualizzate su un thread diverso (forse alcune soluzioni per viste precompilate?) Otterrai un nullvalore per HttpContext.Current.

Se ricevi questo errore, fammi sapere nei commenti e menziona se stai usando viste precompilate o qualcosa di speciale che potrebbe comportare il rendering / esecuzione parziale delle tue viste su un altro thread!


2
Ha il vantaggio di poterlo attivare negli ambienti di test di integrazione per diagnosticare problemi di distribuzione che spesso non vengono visualizzati fino a quando non vengono installati su PC non sviluppatori.
Tony Wall,

2
Ottengo un'eccezione di riferimento null usando questo, probabilmente perché in modalità Release l'attributo debug viene rimosso completamente da web.config.
Alex Angas,

1
@AlexAngas Impossibile ripetere. :( Ho creato un progetto in .NET 4.5.1 (ASP.NET MVC 5, System.Webversione 4.0.0.0) e anche con l' debugattributo (o, in effetti, l'intero compilationelemento) rimosso, non ottengo un'eccezione. le migliori ipotesi sono che questo è un bug che è stato corretto nelle versioni successive System.Webdell'assembly o che c'è qualcosa di diverso nella tua situazione specifica di cui non sono a conoscenza. Potresti creare un progetto di test minimo e caricarlo da qualche parte?
Jordan Grey

4
@JordanGray Grazie per aver dato un'occhiata - Ho appena provato anche un nuovo progetto e non riesco nemmeno a riproporlo! La tua soluzione sta funzionando. Purtroppo non ho tempo di guardare oltre al momento, ma se mi imbatto nella ragione aggiornerò questo post.
Alex Angas,

5
Compagno sanguinante e brillante; questa dovrebbe essere la risposta dei PO.
nocarrier,

23

C # e ASP.NET MVC: utilizzo della direttiva #if in una vista

In realtà quella risposta ha la risposta giusta. Dovrai passare se sei o meno in modalità debug tramite il Modello. (o ViewBag) poiché tutte le visualizzazioni sono compilate in modalità debug.


27
Si noti che poiché le viste Razor sono sempre compilate in modalità Debug, l'impostazione di una direttiva preprocessore in questo modo non avrà alcun effetto. // your debug stuff
Eseguirai

1
Heh, sì, me ne sono appena reso conto quando l'ho scritto.
Inizia il

14

So che questa non è una risposta diretta alla domanda, ma poiché sono abbastanza sicuro che la configurazione del debug sia corollaria del fatto che stai effettivamente eseguendo localmente, puoi sempre usare la Request.IsLocalproprietà come test di debug. Pertanto:

@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">
}

1
Non necessariamente. È possibile eseguire in modalità Debug su un server di test / sviluppo, ad esempio, prima di compilare in modalità Rilascio su Staging / Produzione.
Jonnybot,

In questo caso sarà utile un metodo di estensione dell'helper HTML per il rendering del tag di collegamento. All'interno del metodo di estensione è possibile utilizzare #if DEBUG o una variabile di configurazione per decidere l'ambiente.
sree,

6

La mia soluzione è molto stupida, ma funziona. Definisci una costante globale da qualche parte in un file statico:

public static class AppConstants
{
#if DEBUG
        public const bool IS_DEBUG = true;
#else
        public const bool IS_DEBUG = false;
#endif
}

Quindi usalo con Razor in HTML:

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}

imho, non è così stupido. nel debug voglio usare es6-javascript (quindi vedo gli errori es6 durante lo sviluppo) e in rilascio voglio usare il non-es6-javascript convertito automaticamente (perché IE11 non conosce es6). questa è un'ottima soluzione per me.
Matthias Burger,

Grazie Matthias!
Tedebus,

bello - semplice diretto, non ambiguo
Serexx

5

Per impostazione predefinita, le viste MVC non vengono compilate, quindi #IF DEBUG non può funzionare in una vista. Se si desidera compilare la vista per accedere alla configurazione IF DEBUG, è necessario:

  1. Fare clic con il tasto destro del mouse sul progetto in Visual Studio
  2. Scarica il progetto
  3. Modifica progetto

cambia il seguente attributo da falso a vero

<MvcBuildViews>true</MvcBuildViews>

ricaricare il progetto e quindi le viste verranno compilate.

L'unica altra soluzione potrebbe essere quella di avere una funzione nel codice dietro

public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
   var value = false;
   #if(DEBUG)
       value=true;
   #endif
   return value;
}

e poi chiamalo dalla vista:

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

3

Per me, il codice qui sotto ha funzionato molto bene.

Quando l'applicazione esegue il debug , vengono visualizzati i miei pulsanti, quando è Rilascio , non lo fanno.

@if (this.Context.IsDebuggingEnabled)
{
    <button type="button" class="btn btn-warning">Fill file</button>
    <button type="button" class="btn btn-info">Export file</button>
} 

3

Questo funziona per me in un progetto white label .net core 3.0

    @{
    #if CORPA
    }
         <button type="button" class="btn btn-warning">A Button</button>
    @{
    #else
    }
         <p>Nothing to see here</p>
    @{
    #endif
    }

2

In .NET Core, puoi fare quanto segue invece di controllare le variabili del preprocessore:

<environment include="Development">
  <!--Debug code here-->
</environment>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.