2011-11-30 11 views
8

W „Właściwości” w moim projekcie mam następujący:Stosując warunkowe symbole kompilacji w MVC widoki

enter image description here

Chcę sprawdzić, czy TEST symbol istnieje, a dopiero potem zrobić kilka rzeczy. Zrobiłem to, co widać na poniższym obrazku iw klasie, która działa. To jednak nie działa w widokach.

enter image description here

tekst w tym bloku jest szary nawet jeśli TEST jest zdefiniowany!

Jak mogę to spowodować, jeśli zdefiniowano TEST?

Odpowiedz

10

Problem związany jest z faktem, że widoki są kompilowane tylko wówczas, gdy uruchamiasz aplikację, więc zdefiniowany przez ciebie symbol TEST nie jest już stosowany przez kompilator, ponieważ nie ma wiedzy o nim.

Zakładając, że używasz C# trzeba skonfigurować kompilator do korzystania z TEST symbol przy budowie widoki, a do tego trzeba override its configuration w Web.config przy użyciu następujących:

<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> 

Ważne jest to, że definiujesz compilerOptions="/define:TEST". Resztę konfiguracji należy dostosować do konkretnych potrzeb, na przykład przełączać się między .NET 2.0 lub .NET 4.0.

Jeśli zastosujesz to bezpośrednio w Web.config, zadziała, ale zdefiniuje za każdym razem TEST. Więc tak naprawdę powinieneś użyć Web.config transformations, aby symbol został zastosowany tylko dla prawidłowych konfiguracji kompilacji.

+0

Tak, teraz tekst nie jest "szary" - ale działa, gdy usunę "TEST" lub nie ... – ParPar

+0

Musisz zsynchronizować obie definicje 'TESTU '. Jeśli usuniesz go z właściwości projektu, musisz również usunąć go z konfiguracji. –

+0

Rozumiem, wielkie dzięki! – ParPar

2

Ustawiony symbol jest używany tylko podczas kompilacji. Nie istnieje inaczej. W związku z tym biblioteka DLL twojego projektu WWW nie ma w żadnym wypadku ani tego symbolu. Dlatego, gdy View jest kompilowany. symbol tam nie ma i nie zadziała, jak się spodziewasz.

1

Nie sądzę, że możliwe jest użycie symboli warunkowych w widoku, o którym mówił już Andrew Barber.

Ale można użyć symboli warunkowych w modelu

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

a następnie sprawdź wartość w polu widzenia:

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

Czy muszę to robić tylko w ViewModel? – ParPar

+0

@ParPar: Trzeba by było wykonać sprawdzenie w modelu widoku (gdzie mogą być użyte symbole kompilacji), które następnie ustawiałyby flagę widoku widoku. W powyższej odpowiedzi ustawiłem tę flagę w konstruktorze widoku widoku. Ta flaga może zostać przetestowana po przejściu do modelu. – Dangerous

9

Zamiast określać flag kompilatora w web.config zgodnie z przyjętym odpowiedź (która wymaga także określa wersję kompilatora w web.config, który jest niestandardowym miejscu) Poszedłem z następujących czynności:

Dodaj metodę klasy bazowej udostępnionego przez moich modeli

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

Użyj tej metody w moich poglądów

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

Czy to nie jest to samo, co sugeruje Dangerous? –

+0

Nie, różnica polega na tym, że używam flagi, która jest automatycznie ustawiana w czasie kompilacji (zobacz pierwsze zdanie z mojej odpowiedzi). –

Powiązane problemy