web-dev-qa-db-fra.com

C # et ASP.NET MVC: utilisation de la directive #if dans une vue

J'ai un symbole de compilation conditionnelle que j'utilise appelé "RELEASE", que j'ai indiqué dans les propriétés de mon projet dans Visual Studio. Je veux qu'un CSS particulier soit appliqué aux éléments lorsque le symbole RELEASE est défini, et j'essayais de le faire à partir de la vue, mais cela ne semble pas fonctionner.

Mon code d'affichage ressemble à ceci (raccourci un peu à des fins de démonstration):

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

Avec ce code et avec le jeu de symboles RELEASE, le code 'else' est en cours d'exécution et j'obtiens un div avec la classe debugBanner. Il ne semble donc pas que la libération soit définie. Il convient de noter que mon code C # réel dans les fichiers .cs reconnaît RELEASE et exécute le code correct. C'est seulement la vue qui me pose le problème.

Quelqu'un a-t-il une idée de cela? Toute aide serait appréciée. Merci.

Clarification: J'aurais dû mentionner que cette vue est déjà une vue partielle, et je la rendrai simplement dans les pages où j'en ai besoin. C'est parce que ces bannières seront sur certaines pages et pas sur d'autres. Ainsi, même lors du rendu sous forme de vue partielle via:

Html.RenderPartial("BannerView");

ça ne fonctionne pas.

46
MegaMatt

Dans votre modèle:

bool isRelease = false;

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

À votre avis:

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

Je récemment découvert que vous pouvez simplement tester:

HttpContext.Current.IsDebuggingEnabled

dans Vues, ​​ce qui vous évite de vérifier les symboles dans d'autres parties de votre application.

106
UpTheCreek

Une meilleure solution, plus générique, consiste à utiliser une méthode d'extension, afin que toutes les vues y aient accès:

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

Vous pouvez ensuite l'utiliser comme suit dans n'importe quelle vue (syntaxe de rasoir):

@if(Html.IsReleaseBuild())
...
61
Birdman
@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag
}
9
d.popov

Vous pouvez utiliser ViewBag au lieu de viewmodel (mais une approche de type viewmodel est meilleure):

Manette :

controller code

Vue :

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

Utilisation:

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

Assurez-vous également que la variable NIKITA_DEBUG existe dans l'onglet de génération de votre projet:

build tab

3
Nigrimmist

Pour moi, le code ci-dessous a très bien fonctionné. Lorsque l'application est en train de déboguer, mes boutons apparaissent, quand est Release, ne le faites pas.

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