Oggi sto scrivendo la mia prima pagina di razor, non riesco a capire come inserire #if debug #else #endif
Come posso inserire il preprocessore nel razor?
Ho appena creato un metodo di estensione:
public static bool IsDebug(this HtmlHelper htmlHelper) { #if DEBUG return true; #else return false; #endif }
Poi l’ho usato nelle mie opinioni in questo modo:
Poiché l’helper è compilato con il simbolo DEBUG / RELEASE, funziona.
Questo è incorporato in HttpContext
:
@if (HttpContext.Current.IsDebuggingEnabled) { // Means that debug="true" in Web.config }
IMO, questo ha più senso della compilazione condizionale per le viste e risulta utile per alcuni scenari di test. (Vedi il commento di Code Chief sotto).
NullReferenceException
: NullReferenceException
per HttpContext.Current
Alex Angas ha affermato di aver ottenuto una NullReferenceException
con questa soluzione, e alcune persone hanno upvoted indicando che questo potrebbe non essere un evento isolato.
La mia ipotesi migliore: HttpContext.Current
è memorizzata in CallContext
, il che significa che è accessibile solo dal thread che gestisce la richiesta HTTP in entrata. Se le tue viste sono state renderizzate su un thread diverso (forse alcune soluzioni per le viste precompilate?) Otterresti un valore null
per HttpContext.Current
.
Se ricevi questo errore, per favore fammi sapere nei commenti e menzioni se stai usando viste precompilate o qualcosa di speciale che potrebbe rendere le tue visualizzazioni parzialmente renderizzate / eseguite su un altro thread!
C # e ASP.NET MVC: utilizzo della direttiva #if in una vista
In realtà quella risposta ha la risposta giusta. Dovrai passare o meno se sei in modalità di debug tramite il Modello. (o ViewBag) poiché tutte le viste sono compilate in modalità di debug.
So che questa non è una risposta diretta alla domanda, ma siccome sono abbastanza sicuro che la configurazione del debug è corollario al fatto che si sta eseguendo localmente, si può sempre usare la proprietà Request.IsLocal
come test di debug like. Quindi:
@if (Request.IsLocal) { } else { }
Per impostazione predefinita, le viste MVC non sono compilate, quindi # DEBUG non può funzionare in una vista. Se vuoi compilare la vista per accedere a IF DEBUG config, devi:
cambia il seguente attributo da falso a vero
true
ricarica il tuo progetto e poi le viste saranno compilate.
L’unico altro modo di aggirare sarebbe avere una funzione nel codice
public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page) { var value = false; #if(DEBUG) value=true; #endif return value; }
e quindi chiamalo dalla vista:
if(DEBUG()) { //debug code here } else { //release code here }
Per me, il codice qui sotto ha funzionato molto bene.
Quando l’applicazione è Debug, i miei pulsanti appaiono, quando è Release , non lo fanno.
@if (this.Context.IsDebuggingEnabled) { }