2011-11-30 17 views
8

In "Proprietà" del mio progetto ho il seguente:Uso dei simboli di compilazione condizionale in vista MVC

enter image description here

voglio verificare se TEST simbolo esiste, e solo allora, fare alcune cose. Così ho fatto quello che vedi nella foto qui sotto e nella classe funziona. Tuttavia questo non funziona nelle viste.

enter image description here

Il testo in questo blocco è grigio, anche se TEST è definito!

Come posso farlo funzionare se è stato definito TEST?

risposta

10

Il problema è legato al fatto che le opinioni vengono compilati solo quando si esegue l'applicazione in modo che il simbolo TEST che è stato definito non sia più applicato dal compilatore perché non ne è a conoscenza.

Supponendo che si sta utilizzando C# è necessario configurare al compilatore di utilizzare il simbolo TEST quando si costruisce il punto di vista e per questo è necessario override its configuration nel Web.config utilizzando i seguenti:

<system.codedom> 
    <compilers> 
    <compiler 
     language="c#;cs;csharp" 
     extension=".cs" 
     type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     compilerOptions="/define:TEST" 
     warningLevel="1" /> 
    </compilers> 
</system.codedom> 

La parte importante è che tu definisci compilerOptions="/define:TEST". Il resto della configurazione è necessario adattarsi alle esigenze specifiche, ad esempio passare da .NET 2.0 o .NET 4.0.

Se si applica direttamente nello Web.config, funzionerà ma verrà definito ogni volta TEST. Quindi quello che dovresti fare è usare Web.config transformations in modo che il simbolo venga applicato solo per le configurazioni di build corrette.

+0

Sì, ora il testo non è "grigio" - ma funziona anche se cancello il "TEST" o non ... – ParPar

+0

È necessario sincronizzare entrambe le definizioni di 'TEST'. Se lo rimuovi dalle proprietà del progetto, devi anche rimuoverlo dalla configurazione. –

+0

Capisco, grazie mille! – ParPar

2

Il simbolo impostato viene utilizzato solo durante la compilazione. Non esiste altrimenti. Quindi, la DLL del tuo progetto Web non ha non. Pertanto, quando la vista è compilata. il simbolo non è lì, e non funzionerà come te lo aspetti.

1

Non credo sia possibile utilizzare i simboli condizionali in una vista come ha già detto Andrew Barber.

Ma si potrebbe utilizzare i simboli condizionali nel modello:

public class ViewModel 
{ 
//...whatever else you need to define 

    private bool test; 

    public bool Test 
    { 
     get 
     { 
      return test; 
     } 
    } 

    public ViewModel() 
    { 
     #if (TEST) 
      test = true; 
     #endif 
    } 
} 

e quindi controllare il valore nella vista:

@{ 
    if (Model.Test) 
    { 
     <p>debug statements here</p> 
    } 
} 
+0

devo farlo solo a ViewModel? – ParPar

+0

@ParPar: è necessario eseguire il controllo nel modello di visualizzazione (in cui è possibile utilizzare i simboli di compilazione) per impostare quindi un contrassegno del modello di visualizzazione. Nella risposta sopra ho impostato questo flag nel costruttore del modello di vista. Quella bandiera può quindi essere testata dopo che è stata passata al modello. – Dangerous

9

Invece di specificare il flag di compilazione in web.config come per la risposta accettata (che richiede anche specificando la versione del compilatore nel web.config, che è una posizione non standard) sono andato con il seguente:

Aggiungere un metodo per una classe di base condiviso dai miei modelli

public bool IsDebugBuild 
{ 
    get 
    { 
     #if DEBUG 
     return true; 
     #else 
     return false; 
     #endif 
    } 
} 

utilizzare quel metodo in mie opinioni

if (mm.IsDebugBuild) { 
    <div class="debug"> 
    // Do Stuff 
    </div> 
} 
+0

Non è esattamente questa la stessa cosa suggerita da Dangerous? –

+0

No, con la differenza che utilizzo un flag che viene impostato automaticamente al momento della compilazione (vedere la prima frase della mia risposta). –

Problemi correlati