С# и ASP.NET MVC: использование директивы #if в представлении

У меня есть условный символ компиляции, который я использую под названием "RELEASE", который я указал в своих свойствах проекта в Visual Studio. Я хочу, чтобы какой-то определенный CSS применялся к элементам, когда был определен символ RELEASE, и я пытался сделать это из представления, но он, похоже, не работает.

Мой код выглядит так (сокращенно для демонстрационных целей):

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

С помощью этого кода и с набором символов RELEASE выполняется код 'else', и я получаю div с классом debugBanner. Таким образом, похоже, что RELEASE не определено. Стоит отметить, что мой фактический код С# в .cs файлах распознает RELEASE и запускает правильный код. Это только мнение, которое дает мне проблему.

Кто-нибудь может понять это? Любая помощь будет оценена по достоинству. Спасибо.

Разъяснение: Я должен был упомянуть, что это представление уже является частичным представлением, и я просто сделаю его на страницах, где мне это нужно. Это потому, что эти баннеры будут на определенных страницах, а не на других. Поэтому даже при рендеринге его как частичном представлении с помощью:

Html.RenderPartial("BannerView");

он не работает.

Ответ 1

В вашей модели:

bool isRelease = false;

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

На ваш взгляд:

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

Ответ 2

I недавно обнаружил, что вы можете просто проверить:

HttpContext.Current.IsDebuggingEnabled

в представлениях, которые сохраняют ваши проверки символов в других частях вашего приложения.

Ответ 3

Лучшим, более общим решением является использование метода расширения, поэтому все представления имеют к нему доступ:

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

Затем вы можете использовать его, как показано ниже, в любом представлении (синтаксис бритвы):

@if(Html.IsReleaseBuild())
...

Ответ 4

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

Ответ 5

Вы можете использовать ViewBag вместо viewmodel (но лучше использовать режим viewmodel):

Контроллер:

controller code

Вид:

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

Использование:

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

Кроме того, убедитесь, что переменная NIKITA_DEBUG существует во вкладке сборки вашего проекта:

build tab

Ответ 6

Ниже приведен синтаксис Razor для условных директив компилятора. Он загружает версию jQuery разработчика, когда переменная DEBUG задана в профиле VS или web.config. В противном случае загружается версия 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
}