我今天在写我的第一个剃须刀页面,不知道如何输入 #if debug #else #endif
如何在剃须刀中输入预处理器?
#if debug
剃须刀,但这永远都是正确的。因此,您的问题的答案是这样做没有任何意义,因为Razor始终会在调试模式下进行编译。
我今天在写我的第一个剃须刀页面,不知道如何输入 #if debug #else #endif
如何在剃须刀中输入预处理器?
#if debug
剃须刀,但这永远都是正确的。因此,您的问题的答案是这样做没有任何意义,因为Razor始终会在调试模式下进行编译。
Answers:
我刚刚创建了一个扩展方法:
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符号进行编译的,因此它可以工作。
public static bool IsDebug(...){ return true; }
对于非DEBUG模式,预处理器将基本上读取,反之亦然。
@if (HttpContext.Current.IsDebuggingEnabled)
{
// Means that debug="true" in Web.config
}
IMO,这比对视图进行条件编译更有意义,并且在某些测试场景中非常有用。(请参阅下面的Tony Wall的评论。)
NullReferenceException
用于HttpContext.Current
亚历克斯·安加斯(Alex Angas)提到他们可以NullReferenceException
使用此解决方案,一些人对此表示反对,这可能不是一个孤立的事件。
我的最佳猜测:HttpContext.Current
存储在中CallContext
,这意味着它只能由处理传入HTTP请求的线程访问。如果您的视图是在不同的线程上呈现的(也许有一些预编译视图的解决方案?),您将获得的null
价值HttpContext.Current
。
如果出现此错误,请在评论中让我知道,并提及您使用的是预编译视图还是任何可能导致您的视图在另一个线程上部分渲染/执行的特殊设置!
System.Web
版本4.0.0.0)中创建了一个项目,即使删除了该debug
属性(或者实际上是整个compilation
元素),我也没有遇到异常。最好的假设是这是在更高版本的System.Web
程序集中已修复的错误,或者我不知道您的具体情况是否有所不同,您可以创建一个最小的测试项目并将其上传到某个地方吗?
实际上,这个答案是正确的答案。您将必须通过模型来传递是否处于调试模式。(或ViewBag),因为所有视图都是在调试模式下编译的。
// your debug stuff
我知道这不是问题的直接答案,但是由于我敢肯定调试配置对您实际上是在本地执行这一事实是必然的,因此您始终可以将该Request.IsLocal
属性用作调试(如test)。因此:
@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">
}
我的解决方案很愚蠢,但可以。在静态文件的某处定义全局常量:
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>
}
默认情况下,不会编译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
}
对我来说,下面的代码效果很好。
当应用程序为Debugging时,出现我的按钮,而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>
}