C # и ASP.NET MVC: использование директивы #if в представлении - PullRequest
45 голосов
/ 01 июня 2010

У меня есть условный символ компиляции, который я использую под названием «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 определен. Стоит отметить, что мой настоящий код C # в файлах .cs распознает RELEASE и выполняет правильный код. Проблема заключается только в том, что мне кажется.

У кого-нибудь есть понимание этого? Любая помощь будет оценена. Спасибо.

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

Html.RenderPartial("BannerView");

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

Ответы [ 7 ]

106 голосов
/ 22 декабря 2010

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

HttpContext.Current.IsDebuggingEnabled

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

61 голосов
/ 15 января 2012

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

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

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

@if(Html.IsReleaseBuild())
...
17 голосов
/ 01 июня 2010

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

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>
<% } %>
9 голосов
/ 11 июня 2013
@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag
}
3 голосов
/ 19 мая 2015

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

Контроллер:

controller code

Просмотр:

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

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

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

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

build tab

1 голос
/ 04 января 2018

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

@if (this.Context.IsDebuggingEnabled)
{
    <button type="button" class="btn btn-warning">Fill file</button>
    <button type="button" class="btn btn-info">Export file</button>
} 
0 голосов
/ 12 июля 2011

Ниже приведен синтаксис Razor для директив условного компилятора. Он загружает версию jquery для разработчика, когда переменная DEBUG установлена ​​в профиле VS или web.config. В противном случае загружается минимальная версия.

@{#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
}
...