Я пишу свою первую страницу бритвы сегодня, не могу понять, как ввести #if debug #else #endif
Как я могу ввести препроцессор в бритву?
Я пишу свою первую страницу бритвы сегодня, не могу понять, как ввести #if debug #else #endif
Как я могу ввести препроцессор в бритву?
НЕ РАБОТАЕТ: См. ниже ответ Shawn.
@{
#if DEBUG
// your content
#else
// your content
#endif
}
Надеюсь на эту помощь.
Извините! Этот код всегда DEBUG.
Я был неправ.
и рекомендованный модельный подход.
если используется только Web, ссылка Свойство HttpContext.Current.IsDebuggingEnabled.
Я только что создал метод расширения:
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, он работает.
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
ИМО, это имеет больше смысла, чем условная компиляция для представлений и пригодится для некоторых сценариев тестирования. (См. Комментарий начальника кодекса ниже.)
NullReferenceException
для HttpContext.Current
Алекс Ангас отметил, что с этим решением они получают NullReferenceException
, и несколько человек проголосовали, указав, что это не может быть изолированным событием.
Мое лучшее предположение: HttpContext.Current
хранится в CallContext
, то есть он доступен только потоку, который обрабатывает входящий HTTP-запрос. Если ваши представления отображаются в другом потоке (возможно, некоторые решения для предварительно скомпилированных представлений?), Вы получите null
значение для HttpContext.Current
.
Если вы получили эту ошибку, пожалуйста, дайте мне знать в комментариях и укажите, используете ли вы предварительно скомпилированные представления или что-то особенное, что может привести к частичной визуализации/выполнению ваших представлений в другом потоке!
С# и ASP.NET MVC: использование директивы #if в представлении
Собственно, этот ответ имеет правильный ответ. Вам придется пройти независимо от того, находитесь ли вы в режиме отладки с помощью модели. (или ViewBag), поскольку все представления компилируются в режиме отладки.
Я знаю, что это не прямой ответ на вопрос, но поскольку я уверен, что конфигурация отладки является следствием того факта, что вы на самом деле выполняете локально, вы всегда можете использовать свойство 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">
}
По умолчанию представления MVC не компилируются, поэтому #IF DEBUG не может работать в представлении. Если вы хотите скомпилировать представление для доступа к конфигурации IF DEBUG, вам необходимо:
измените следующий атрибут от 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
}
Для меня код ниже работал очень хорошо.
Когда приложение отлаживается, появляются мои кнопки, а когда - релиз, они не отображаются.
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}
Мое решение очень глупо, но оно работает. Определите глобальную константу где-нибудь в статическом файле:
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>
}