我今天正在写我的第一个Razor页面,不知道如何进入
#if debug
...
#else
...
#endif
我如何在Razor中做到这一点?
我今天正在写我的第一个Razor页面,不知道如何进入
#if debug
...
#else
...
#endif
我如何在Razor中做到这一点?
当前回答
在.NET Core中,你可以使用环境标记帮助器来代替检查预处理器变量:
<environment include="Development">
<!--Debug code here-->
</environment>
其他回答
我的解决办法很愚蠢,但很有效。 在静态文件中定义一个全局常量:
public static class AppConstants
{
#if DEBUG
public const bool IS_DEBUG = true;
#else
public const bool IS_DEBUG = false;
#endif
}
然后在HTML中使用Razor:
@if (AppConstants.IS_DEBUG)
{
<h3>Debug mode</h3>
}
else
{
<h3>Release mode</h3>
}
这适用于我的。net Core 3.0白色标签项目:
@{
#if CORPA
}
<button type="button" class="btn btn-warning">A Button</button>
@{
#else
}
<p>Nothing to see here</p>
@{
#endif
}
这是内置在HttpContext中的:
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
在我看来,这比视图的条件编译更有意义,而且在一些测试场景中很方便。(请看下面托尼·沃尔的评论。)
旁注:HttpContext的NullReferenceException。当前的
Alex Angas提到,他们用这个解决方案得到了一个NullReferenceException,一些人已经投了赞成票,表明这可能不是一个孤立的事件。
我的最佳猜测是:HttpContext。Current存储在CallContext中,这意味着只有处理传入HTTP请求的线程才能访问它。如果你的视图在不同的线程上被呈现(也许是一些预编译视图的解决方案?),你会得到HttpContext.Current的空值。
如果你得到这个错误,请在评论中告诉我,并提到如果你正在使用预编译的视图或任何特殊设置,可能导致你的视图被部分呈现/在另一个线程上执行!
在.NET Core中,你可以使用环境标记帮助器来代替检查预处理器变量:
<environment include="Development">
<!--Debug code here-->
</environment>
我刚刚创建了一个扩展方法:
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>
因为helper是用DEBUG/RELEASE符号编译的,所以它可以工作。