2010-06-01 11 views
44

Ho un simbolo di compilazione condizionale che sto usando chiamato "RELEASE", che ho indicato nelle proprietà del mio progetto in Visual Studio. Voglio che alcuni particolari CSS vengano applicati agli elementi quando il simbolo RELEASE è definito, e stavo cercando di farlo dalla vista, ma non sembra funzionare.C# e ASP.NET MVC: utilizzo della direttiva #if in una vista

Il mio codice vista si presenta così (accorciato un po 'per scopi dimostrativi):

<% #if (RELEASE) %> 
    <div class="releaseBanner">Banner text here</div> 
<% #else %> 
    <div class="debugBanner">Banner text here</div> 
<% #endif %> 

Con questo codice, e con il set di simboli RELEASE, il codice 'altro' è in esecuzione e sto ottenendo un div con la classe debugBanner. Quindi non sembra pensare che RELEASE sia definito. Vale la pena notare che il mio codice C# nei file .cs sta riconoscendo RELEASE ed esegue il codice corretto. È solo la vista che mi sta dando il problema.

Qualcuno ha qualche idea in questo? Qualsiasi aiuto sarebbe apprezzato. Grazie.

Chiarimento: Avrei dovuto dire che questa vista è già una vista parziale e la renderò semplicemente nelle pagine in cui ho bisogno. Questo perché questi banner saranno su determinate pagine e non su altri. Così, anche quando il rendering come una vista parziale tramite:

Html.RenderPartial("BannerView");

non funziona.

+3

Perché non si crea un metodo di supporto html e si inserisce il codice? È quindi possibile eseguire if e eseguire un rendering parziale per mantenere l'HTML – Rippo

+0

Non troppo familiare con i metodi helper html. Ho chiarito la mia domanda per indicare che questa è una visione parziale con cui sto lavorando. Puoi approfondire un po 'il tuo suggerimento? –

+1

le direttive del preprocessore funzionano solo @ compile-time ... @DeveloperArt ha una soluzione elegante ... – xandercoded

risposta

17

nel modello:

bool isRelease = false; 

<% #if (RELEASE) %> 
    isRelease = true; 
<% #endif %> 

Secondo lei:

<% if (Model.isRelease) { %> 
    <div class="releaseBanner">Banner text here</div> 
<% } else { %> 
    <div class="debugBanner">Banner text here</div> 
<% } %> 
+0

Sto raccogliendo da questa risposta che non è possibile controllare i simboli di compilazione da una vista, e ciò deve essere fatto da un file .cs. È vero? –

+0

Soluzione piacevole, ma che dire di mettere questa logica in un controller di base ereditato da tutti i controller. Quindi potresti avere accesso a questa proprietà attraverso tutti i controller ... – xandercoded

+1

beh, non sono sicuro che funzionerebbe perfettamente xander. Per avere accesso ad esso dalla vista, avremmo bisogno di un modello con quella proprietà, non un controller con quella proprietà. Quindi dovrei davvero passare lo stesso modello da più controller e renderizzare quella vista, che sarebbe una sorta di dolore. –

104

I recentemente scoperto che si può semplicemente prova:

HttpContext.Current.IsDebuggingEnabled 

in Visualizzazioni, che consente di risparmiare controllare i simboli in altre parti della tua app.

+1

Questo è l'approccio migliore, IMO. –

+2

Non dovresti usare invece 'this.Context.IsDebuggingEnabled'? Applicabile in realtà solo se hai preso in giro il contesto o in qualche modo [usato il rasoio al di fuori di una webapp] (http://stackoverflow.com/questions/3628895/is-it-possibile-per-utilizzare-razor-vista-engine- outside-asp-net) – drzaus

-7

Di seguito è riportata la sintassi Razor per le direttive del compilatore condizionale. Carica la versione di sviluppo di jquery quando la variabile DEBUG è impostata nel profilo VS o web.config. Altrimenti viene caricata la versione min.

@{#if (DEBUG) 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js"></script> 

#else 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js"></script> 
#endif 
} 
+1

non penso che funzionerà dato che le viste non sono compilate e se (DEBUG) è una direttiva del compilatore? – Tom

+1

Che non funziona in Razor. Questo è esattamente ciò che la domanda originale su. – trailmax

57

Una soluzione più generica migliore è quello di utilizzare un metodo di estensione, in modo da tutte le viste hanno accesso ad esso:

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

È quindi possibile utilizzarlo come segue in qualsiasi vista (sintassi rasoio):

@if(Html.IsReleaseBuild()) 
... 
+1

Questo è un metodo fantastico! grazie per la condivisione! – trailmax

+1

ovviamente, l'avvertenza è che dipende da dove questo metodo è - se è in una libreria condivisa che è stata compilata in modalità di rilascio, restituirà 'false' quando è incluso in un progetto compilato in modalità di debug. – drzaus

+0

Si prega di verificare questa domanda http://stackoverflow.com/questions/28400135/public-conditional-razor-views-with-minified-js-and-css – chemitaxis

9
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag 
} 
3

È possibile utilizzare ViewBag invece di viewmodel (ma approccio viewmodel simile è meglio):

0.123.

Controller:

controller code

Vista:

@{ 
    bool hideYoutubeVideos = ViewBag.hideYoutubeVideos ?? false;  
} 

Usage:

@if (!hideYoutubeVideos) 
{ 
    <span>hello youtube</span> 
} 

Inoltre, assicurarsi, quella variabile NIKITA_DEBUG esistono in scheda di compilazione del progetto:

build tab

1

Per me, il codice riportato di seguito ha funzionato molto bene. Quando l'applicazione è Debug, i miei pulsanti appaiono, quando è Release, no.

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