Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Razor中的预处理器指令_C#_Asp.net Mvc_Razor_Preprocessor - Fatal编程技术网

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
    }