Механизм просмотра Razor, как ввести препроцессор (#if debug)

Я пишу свою первую страницу бритвы сегодня, не могу понять, как ввести #if debug #else #endif

Как я могу ввести препроцессор в бритву?

Ответ 1

НЕ РАБОТАЕТ: См. ниже ответ Shawn.

@{
  #if DEBUG
     // your content
  #else
     // your content
  #endif
}

Надеюсь на эту помощь.

Извините! Этот код всегда DEBUG.

Я был неправ.

и рекомендованный модельный подход.

если используется только Web, ссылка Свойство HttpContext.Current.IsDebuggingEnabled.

Ответ 2

Я только что создал метод расширения:

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

Затем он использовал его в моих представлениях так:

<section id="sidebar">
     @Html.Partial("_Connect")
     @if (!Html.IsDebug())
     { 
         @Html.Partial("_Ads")
     }
     <hr />
     @RenderSection("Sidebar", required: false)
</section>

Поскольку хелпер скомпилирован с символом DEBUG/RELEASE, он работает.

Ответ 3

Это встроено в HttpContext:

@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Means that debug="true" in Web.config
}

ИМО, это имеет больше смысла, чем условная компиляция для представлений и пригодится для некоторых сценариев тестирования. (См. Комментарий начальника кодекса ниже.)


Примечание: NullReferenceException для HttpContext.Current

Алекс Ангас отметил, что с этим решением они получают NullReferenceException, и несколько человек проголосовали, указав, что это не может быть изолированным событием.

Мое лучшее предположение: HttpContext.Current хранится в CallContext, то есть он доступен только потоку, который обрабатывает входящий HTTP-запрос. Если ваши представления отображаются в другом потоке (возможно, некоторые решения для предварительно скомпилированных представлений?), Вы получите null значение для HttpContext.Current.

Если вы получили эту ошибку, пожалуйста, дайте мне знать в комментариях и укажите, используете ли вы предварительно скомпилированные представления или что-то особенное, что может привести к частичной визуализации/выполнению ваших представлений в другом потоке!

Ответ 4

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

Собственно, этот ответ имеет правильный ответ. Вам придется пройти независимо от того, находитесь ли вы в режиме отладки с помощью модели. (или ViewBag), поскольку все представления компилируются в режиме отладки.

Ответ 5

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

@if (Request.IsLocal)
{
    <link rel="stylesheet" type="text/css" href="~/css/compiled/complete.css">
}
else
{
    <link rel="stylesheet" type="text/css" href="~/css/compiled/complete.min.css">
}

Ответ 6

По умолчанию представления MVC не компилируются, поэтому #IF DEBUG не может работать в представлении. Если вы хотите скомпилировать представление для доступа к конфигурации IF DEBUG, вам необходимо:

  • Щелкните правой кнопкой мыши на своем проекте в Visual Studio
  • Выгрузить проект
  • Изменить проект

измените следующий атрибут от false до true

<MvcBuildViews>true</MvcBuildViews>

перезагрузите проект, а затем просмотрите его.

Единственная другая работа вокруг будет заключаться в том, чтобы функция в вашем коде была

public static Boolean DEBUG(this System.Web.Mvc.WebViewPage page)
{
   var value = false;
   #if(DEBUG)
       value=true;
   #endif
   return value;
}

а затем вызовите его из представления:

if(DEBUG())
{
  //debug code here
}
else
{
  //release code here
}

Ответ 7

Для меня код ниже работал очень хорошо.

Когда приложение отлаживается, появляются мои кнопки, а когда - релиз, они не отображаются.

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

Ответ 8

Мое решение очень глупо, но оно работает. Определите глобальную константу где-нибудь в статическом файле:

public static class AppConstants
{
#if DEBUG
        public const bool IS_DEBUG = true;
#else
        public const bool IS_DEBUG = false;
#endif
}

Затем используйте его с Razor в HTML:

@if (AppConstants.IS_DEBUG)
{
    <h3>Debug mode</h3>
}
else
{
    <h3>Release mode</h3>
}