C# Razor中的预处理器指令
今天我正在写我的第一个剃须刀页面,不知道如何进入C# Razor中的预处理器指令,c#,asp.net-mvc,razor,preprocessor,C#,Asp.net Mvc,Razor,Preprocessor,今天我正在写我的第一个剃须刀页面,不知道如何进入 #if debug ... #else ... #endif 用剃须刀怎么做? 事实上,这个答案是正确的。您必须通过模型传递是否处于调试模式。(或ViewBag),因为所有视图都是在调试模式下编译的。我刚刚创建了一个扩展方法: public static bool IsDebug(this HtmlHelper htmlHelper) { #if DEBUG return true; #else return false
#if debug
...
#else
...
#endif
用剃须刀怎么做?
事实上,这个答案是正确的。您必须通过模型传递是否处于调试模式。(或ViewBag),因为所有视图都是在调试模式下编译的。我刚刚创建了一个扩展方法:
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>
@Html.Partial(“_Connect”)
@如果(!Html.IsDebug())
{
@Html.Partial(“_广告”)
}
@RenderSection(“侧栏”,必填项:false)
由于助手是使用调试/发布符号编译的,因此它可以工作。这是:
在我看来,这比视图的条件编译更有意义,对于某些测试场景来说也很方便。(见下文。)
旁注:
HttpContext.Current的NullReferenceException
他们用这个解决方案得到了一个NullReferenceException
,一些人投票表示这可能不是一个孤立的事件
我的最佳猜测是:HttpContext.Current
存储在CallContext
中,这意味着它只能由处理传入HTTP请求的线程访问。如果您的视图是在不同的线程上呈现的(可能是一些预编译视图的解决方案?),您将获得HttpContext.Current
的null
值
如果您遇到此错误,请在注释中告诉我,并说明您是否使用预编译视图或任何特殊设置,这些设置可能导致您的视图在另一个线程上部分呈现/执行 默认情况下,不编译MVC视图,因此如果调试无法在视图中运行。如果要编译视图以访问If DEBUG config,则需要:
在Visual Studio中右键单击项目
卸载项目
编辑项目
将以下属性从false更改为true
<MvcBuildViews>true</MvcBuildViews>
然后从视图中调用它:
if(DEBUG())
{
//debug code here
}
else
{
//release code here
}
我知道这不是问题的直接答案,但我非常确定调试配置是您实际在本地执行这一事实的必然结果,因此您可以始终使用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">
}
@if(Request.IsLocal)
{
}
其他的
{
}
对我来说,下面的代码运行得非常好
当应用程序正在调试时,我的按钮会出现,当被释放时,它们不会出现
@if (this.Context.IsDebuggingEnabled)
{
<button type="button" class="btn btn-warning">Fill file</button>
<button type="button" class="btn btn-info">Export file</button>
}
@if(this.Context.IsDebuggingEnabled)
{
填充文件
导出文件
}
我的解决方案非常愚蠢,但它确实有效。
在静态文件中的某个位置定义全局常量:
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>
}
@if(AppConstants.IS_DEBUG)
{
调试模式
}
其他的
{
释放模式
}
这在.NET Core 3.0白标签项目中适用:
@{
#if CORPA
}
<button type="button" class="btn btn-warning">A Button</button>
@{
#else
}
<p>Nothing to see here</p>
@{
#endif
}
@{
#如果科尔帕
}
钮扣
@{
#否则
}
这里没什么可看的
@{
#恩迪夫
}
在.NET Core中,您可以使用而不是检查预处理器变量:
我需要类似的东西,在
标记中也可以使用,并且发现下面的方法对于DOM中的条件标记或条件脚本都很有效
@{
#if NOEXTAUTH
{
@:<!-- A single line block of code -->
<text>
<!--
A multi-line block
-->
</text>
}
#endif
}
@{
#如果NOEXTAUTH
{
@:
}
#恩迪夫
}
我的观点的可能重复之处在于,您希望在razor中调试#if debug
,但它总是正确的。因此,您的问题的答案是,这样做没有任何意义,因为Razor总是在调试模式下编译。请注意,由于Razor视图总是在调试模式下编译,因此以这种方式设置预处理器指令实际上不会产生任何效果。您将始终执行//您的调试内容
嘿,是的,我刚意识到当我编写它时。当然,这个扩展方法必须进入MVC项目中,而不是进入一个单独的库中,该库可能使用不同的选项进行编译…这对我根本不起作用-无论编译模式如何,它都会产生“True”。Jordan Gray的回答非常有效。如果是调试模式,预处理器将基本上读取公共静态bool IsDebug(…){return true;}
,对于非调试模式也是如此。这样做的好处是,您可以在集成测试环境中打开它来诊断部署问题,这些问题在安装到非开发人员PC上之前通常不会出现。使用此方法,我会得到一个空引用异常,可能是因为在发布模式下,调试属性完全从web.config中删除。@AlexAngas无法重新编程:(我在.NET4.5.1(ASP.NETMVC5,System.Web
version4.0.0.0)中创建了一个项目,甚至使用了debug
属性(或者整个编译
元素)删除了我没有得到任何例外。我下一个最好的假设是这是一个在System.Web
程序集的更高版本中修复的错误,或者你的特定情况有一些不同,我不知道。你能创建一个最小的测试项目并上传到某个地方吗?@JordanGray感谢你的关注-我刚刚尝试了一个新项目,但也无法重新启动!您的解决方案正在运行。很遗憾,现在没有时间进一步查看,但如果我发现原因,我将更新此帖子。这应该是OPs的答案。不一定。例如,在编译I之前,您可以在测试/开发服务器上以调试模式运行n Staging/Production上的发布模式。在这种情况下,呈现链接标记的html助手扩展方法将有所帮助。在扩展方法中,您可以使用#if DEBUG或配置变量来决定环境。imho,这并不是那么愚蠢。在调试中,我想使用es6 javascript(因此在开发时我看到es6错误)在发行版中,我想使用自动转换的非es6-javascript(因为IE11不知道es6)。这对我来说是一个很好的解决方案。很好的一个-简单直接,明确无误的爱它…我有一个全局静态类用于应用设置…这个插件很好。所有其他答案都很复杂
@{
#if CORPA
}
<button type="button" class="btn btn-warning">A Button</button>
@{
#else
}
<p>Nothing to see here</p>
@{
#endif
}
@{
#if NOEXTAUTH
{
@:<!-- A single line block of code -->
<text>
<!--
A multi-line block
-->
</text>
}
#endif
}