Двигун перегляду бритви, як ввести препроцесор (#if налагодження)


233

Сьогодні я пишу свою першу сторінку з бритвою, не можу зрозуміти, як її ввести #if debug #else #endif

Як я можу ввести препроцесор в бритву?


можливий дублікат stackoverflow.com/questions/378982/…
Handcraftsman

10
Моя думка, ви хочете #if debugв бритві, але це завжди буде правдою. Тож відповідь на ваше запитання полягає в тому, що робити це не має сенсу, оскільки Razor завжди збиратиметься в режимі налагодження.
Buildstarted

4
@mamu чи можете ви прийняти цю відповідь і прийняти відповідь від Шона?
user247702

Відповіді:


370

Я щойно створив метод розширення:

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, він працює.


32
Звичайно, цей метод розширення повинен входити в проект MVC, а не в окрему бібліотеку, яка може бути складена з різними варіантами ...
Ерік Дж.

2
Це взагалі не спрацювало для мене - воно створило "True" незалежно від режиму компіляції. Відповідь Джордана Грея спрацювала чудово.
Тимофій Канський

Якщо це режим DEBUG, попередній процесор, по суті, зчитується public static bool IsDebug(...){ return true; }, і навпаки, не в режимі DEBUG.
facepalm42

300

Це вбудовано дляHttpContext :

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

IMO, це має більше сенсу, ніж умовна компіляція для переглядів і корисна для деяких сценаріїв тестування. (Дивіться коментар Тоні Уолл нижче.)


Бічна примітка: NullReferenceExceptionдляHttpContext.Current

Алекс Ангас зауважив, що вони отримують рішення NullReferenceExceptionз цим рішенням, і кілька людей висловилися за те, що це може бути не поодинокою подією.

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

Якщо ви отримаєте цю помилку, будь ласка, повідомте мене в коментарях і зазначте, якщо ви використовуєте попередньо складені представлення даних або щось інше, що може призвести до того, що ваші погляди частково відображаються / виконуються в іншій темі!


2
Має перевагу ви можете увімкнути його в тестових середовищах інтеграції, щоб діагностувати проблеми розгортання, які часто не помічаються до моменту встановлення на ПК, які не розробники.
Tony Wall

2
Я отримую нульовий довідковий виняток, використовуючи це, можливо, тому що в режимі випуску атрибут налагодження повністю видалено з web.config.
Алекс Ангас

1
@AlexAngas Неможливо спростувати. :( Я створив проект у .NET 4.5.1 (ASP.NET MVC 5, System.Webверсія 4.0.0.0), і навіть із видаленим debugатрибутом (або, справді, усім compilationелементом) я не отримую винятку. Наступний мій Найкращі гіпотези полягають у тому, що це помилка, яку виправили в пізніших версіях System.Webскладання або що у вашій конкретній ситуації є щось інше, про що я не знаю. Чи можете ви створити мінімальний тестовий проект і десь завантажити його
Джордан Грей

4
@JordanGray Дякую за те, що подивився - я також спробував новий проект, а також не можу спростити! Ваше рішення працює. На жаль, немає часу шукати далі на жаль, але якщо я натраплю на причину, я оновлю цю посаду.
Алекс Ангас

5
Кривава блискуча половинка; це має бути відповіддю ОП.
nocarrier

23

C # і ASP.NET MVC: Використання #if директиви у поданні

Насправді ця відповідь має правильну відповідь. Вам доведеться пройти, чи перебуваєте ви в режимі налагодження через Модель. (або ViewBag), оскільки всі представлення складені в режимі налагодження.


27
Зауважте, що оскільки представлення Razor завжди складені в режимі налагодження, встановлення директиви препроцесора таким чином фактично не матиме ніякого ефекту. Ви завжди будете страчувати// your debug stuff
marcind

1
Хе, так, я просто зрозумів це, коли написав це.
Buildstarted

14

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

1
Не обов'язково. Ви можете запустити в режимі налагодження на сервері тесту / розробки, наприклад, перед компіляцією в режимі випуску для постановки / виробництва.
jonnybot

У цьому випадку допоможе метод розширення html-помічника для візуалізації тега посилання. Всередині методу розширення ви можете використовувати #if DEBUG або змінну config для визначення середовища.
sree

6

Моє рішення дуже дурне, але воно працює. Визначте глобальну константу десь у статичному файлі:

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

Імхо, це не так дурно. у налагодженні я хочу використовувати es6-javascript (тому я бачу es6-помилки під час розробки), а у випуску хочу використовувати автоматично перетворений non-es6-javascript (бо IE11 не знає es6). це чудове рішення для мене.
Маттіас Бургер

Дякую вам Маттіас!
тедебус

приємний - простий прямий, однозначний
Serexx

5

За замовчуванням представлення MVC не складено, тому #IF DEBUG не може працювати у представленні. Якщо ви хочете скласти подання для доступу до конфігурації IF DEBUG, вам потрібно:

  1. Клацніть правою кнопкою миші на своєму проекті в Visual Studio
  2. Розвантажити проект
  3. Редагувати проект

змінити наступний атрибут з false на істинний

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

3

Для мене код нижче спрацював дуже добре.

Коли програма налагоджує налагодження, з'являються мої кнопки, коли це пункт 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>
} 

3

Це працює для мене в проекті білої етикетки .net core 3.0

    @{
    #if CORPA
    }
         <button type="button" class="btn btn-warning">A Button</button>
    @{
    #else
    }
         <p>Nothing to see here</p>
    @{
    #endif
    }

2

У .NET Core ви можете зробити наступне замість перевірки змінних препроцесора:

<environment include="Development">
  <!--Debug code here-->
</environment>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.