Razor view engine, как войти в препроцессор (#if debug) - PullRequest
218 голосов
/ 15 января 2011

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

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

Ответы [ 7 ]

354 голосов
/ 21 августа 2011

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

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, онработы.

283 голосов
/ 12 марта 2013

Это , встроенный в HttpContext:

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

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


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

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

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

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

23 голосов
/ 15 января 2011

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

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

13 голосов
/ 18 ноября 2014

Я знаю, что это не прямой ответ на вопрос, но, поскольку я почти уверен, что конфигурация отладки является следствием того факта, что вы фактически выполняете локально, вы всегда можете использовать свойство 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">
}
5 голосов
/ 04 февраля 2014

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

  1. Щелкните правой кнопкой мыши проект в Visual Studio
  2. Выгрузите проект
  3. Редактироватьproject

измените следующий атрибут с 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
}
1 голос
/ 04 апреля 2019

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

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>
}
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>
} 
...