Preprocessor directives in Razor
I am writing my first Razor page today, and can't figure out how to enter
#if debug
...
#else
...
#endif
How can I do that in Razor?
I just created an extension method:
public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
return true;
#else
return false;
#endif
}
Then used it in my views like so:
<section id="sidebar">
@Html.Partial("_Connect")
@if (!Html.IsDebug())
{
@Html.Partial("_Ads")
}
<hr />
@RenderSection("Sidebar", required: false)
</section>
Since the helper is compiled with the DEBUG/RELEASE symbol, it works.
This is built in to HttpContext
:
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
IMO, this makes more sense than conditional compilation for views and comes in handy for some testing scenarios. (See Tony Wall's comment below.)
Side note: NullReferenceException
for HttpContext.Current
Alex Angas mentioned that they get a NullReferenceException
with this solution, and a few people have upvoted indicating that this may not be an isolated event.
My best guess: HttpContext.Current
is stored in CallContext
, meaning it is only accessible by the thread that handles the incoming HTTP request. If your views are being rendered on a different thread (perhaps some solutions for precompiled views?) you would get a null
value for HttpContext.Current
.
If you get this error, please let me know in the comments and mention if you are using precompiled views or anything special set up that could result in your views being partially rendered/executed on another thread!
C# and ASP.NET MVC: Using #if directive in a view
Actually that answer has the right answer. You're going to have to pass whether or not you're in debug mode via the Model. (or ViewBag) since all views are compiled in debug mode.
I know this is not a direct answer to the question but as I'm pretty sure debug configuration is corollary to the fact that you are actually executing locally, you can always use the Request.IsLocal
property as a debug like test. Thus :
@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">
}