2010-06-01 9 views
44

Mam symbol warunkowej kompilacji, którego używam, zwany "RELEASE", który wskazałem we właściwościach mojego projektu w Visual Studio. Chcę, aby niektóre elementy CSS zostały zastosowane do elementów, gdy zdefiniowano symbol RELEASE, i próbowałem to zrobić z widoku, ale wydaje się, że nie działa.C# i ASP.NET MVC: Używanie dyrektywy #if w widoku

Mój kod widoku wygląda następująco (skrócony nieco do celów demonstracyjnych):

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

Z tym kodem oraz z zestawem RELEASE instrumentu, „inny” kod działa i jestem coraz div z klasą debugBanner. Wydaje się więc, że nie zdefiniowano RELEASE. Warto zauważyć, że mój aktualny kod C# w plikach .cs rozpoznaje RELEASE i uruchamia poprawny kod. To tylko widok sprawia mi problem.

Czy ktoś ma wgląd w to? Każda pomoc będzie doceniona. Dzięki.

Wyjaśnienie: Powinienem wspomnieć, że ten pogląd jest już częściowy widok, a ja po prostu uczynić go na stronach gdzie jej potrzebują. To dlatego, że te banery będą na niektórych stronach, a nie na innych. Więc nawet przy renderowaniu go jako częściowy widok poprzez:

Html.RenderPartial("BannerView");

nie działa.

+3

Dlaczego nie utworzysz metody helpera HTML i nie wstawisz tam swojego kodu? Następnie można wykonać renderowanie częściowe i częściowe, aby zachować kod HTML – Rippo

+0

Niezbyt dobrze znane metody html helper. Zrobiłem wyjaśnienie mojego pytania, aby wskazać, że jest to częściowy widok, nad którym pracuję. Czy możesz nieco rozwinąć swoją sugestię? –

+1

dyrektywy preprocesora działają tylko w czasie kompilacji ... @DeveloperArt ma eleganckie rozwiązanie ... – xandercoded

Odpowiedz

17

W modelu:

bool isRelease = false; 

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

W widoku:

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

Z tej odpowiedzi wynika, że ​​nie jest możliwe sprawdzenie symboli kompilacji z widoku, a to musi być zrobione z pliku .cs. Czy to prawda? –

+0

Ładne rozwiązanie, ale co z umieszczeniem tej logiki w kontrolerze bazowym, który dziedziczy wszystkie kontrolery. Wtedy mógłbyś mieć dostęp do tej własności przez wszystkie Kontrolery ... – xandercoded

+1

cóż, nie jestem pewien, czy całkowicie działałoby to xander. Aby uzyskać do niego dostęp z widoku, potrzebowalibyśmy modelu z tą właściwością, a nie kontrolera z tą właściwością. Tak więc naprawdę musiałbym przekazać ten sam model z wielu kontrolerów i renderować ten widok, co byłoby rodzajem bólu. –

104

I niedawno odkrył, że można po prostu próba:

HttpContext.Current.IsDebuggingEnabled 

w widokach, które pozwala uniknąć sprawdzanie symboli w innych częściach aplikacji.

+1

To jest najlepsze podejście, IMO. –

+2

Nie powinieneś zamiast tego używać 'this.Context.IsDebuggingEnabled'? Ma to zastosowanie tylko, jeśli wyśmiałeś kontekst lub w jakiś sposób [użyłeś widoków brzytwy poza aplikacją internetową] (http://stackoverflow.com/questions/3628895/is-it-possible-to-use-razor-view-engine- poza-asp-net) – drzaus

-7

Poniżej przedstawiono składnię maszyn Razor dla warunkowych dyrektyw kompilujących. Ładuje deweloperską wersję jquery, gdy zmienna DEBUG jest ustawiona w profilu VS lub web.config. W przeciwnym razie ładowana jest wersja 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

nie sądzę, że to zadziała, ponieważ widoki nie są kompilowane i czy (DEBUG) jest dyrektywą kompilatora? – Tom

+1

To nie działa w maszynce Razor. O to właśnie chodzi w pierwotnym pytaniu. – trailmax

57

Lepszym, rozwiązanie bardziej ogólny jest użycie metody rozszerzenie, więc wszystkie widoki mieć do niego dostęp:

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

Następnie można używać go jak następuje w dowolnym widoku (składni brzytwa):

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

To jest niesamowita metoda! dzięki za udostępnienie! – trailmax

+1

Oczywiście, jest to zależne od tego, gdzie jest ta metoda - jeśli jest w bibliotece współdzielonej, która została skompilowana w trybie wydania, zwróci wartość "false", gdy jest zawarta w projekcie skompilowanym w trybie debugowania. – drzaus

+0

Proszę sprawdzić to pytanie http://stackoverflow.com/questions/28400135/public-conditional-razor-views-w-minified-js-and-css – chemitaxis

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

można użyć ViewBag zamiast viewmodel (ale podejście ViewModel-jak jest lepiej):

Kontroler:

controller code

Widok:

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

Zastosowanie:

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

Należy także pamiętać, że zmienna NIKITA_DEBUG istnieć w karcie kompilacji projektu:

build tab

1

Dla mnie poniższy kod działa bardzo dobrze. Kiedy aplikacja debuguje moje przyciski pojawiają się, kiedy jest Release, nie.

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