Razor视图引擎,如何进入预处理器(#if debug)

时间:2011-01-14 21:32:57

标签: asp.net-mvc razor preprocessor

我今天正在写第一个剃刀页面,无法弄清楚如何输入#if debug #else #endif

如何在剃刀中输入预处理器?

10 个答案:

答案 0 :(得分:349)

我刚创建了一个扩展方法:

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符号编译的,因此可以正常工作。

答案 1 :(得分:281)

这是built in to HttpContext

@if (HttpContext.Current.IsDebuggingEnabled)
{
    // Means that debug="true" in Web.config
}

IMO,这比视图的条件编译更有意义,并且在某些测试场景中派上用场。 (参见下面的Code Chief's comment。)


附注:NullReferenceException

HttpContext.Current

Alex Angas mentioned他们使用此解决方案得到NullReferenceException,并且有少数人投票表明这可能不是一个孤立的事件。

我最好的猜测:HttpContext.Current存储在CallContext中,这意味着它只能由处理传入HTTP请求的线程访问。如果您的视图是在不同的线程上呈现的(可能是预编译视图的某些解决方案?),您将获得null的{​​{1}}值。

如果您收到此错误,请在评论中告诉我们,并提及您是否使用预编译视图或任何特殊设置,这可能会导致您的视图在另一个线程上被部分呈现/执行!

答案 2 :(得分:23)

C# and ASP.NET MVC: Using #if directive in a view

实际上答案是正确的答案。无论你是否通过模型进入调试模式,你都必须通过。 (或ViewBag),因为所有视图都是在调试模式下编译的。

答案 3 :(得分:13)

我知道这不是问题的直接答案,但由于我非常确定调试配置是您实际在本地执行的必然结果,因此您始终可以使用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">
}

答案 4 :(得分:6)

这在白色标签项目.net core 3.0中对我有用

    @{
    #if CORPA
    }
         <button type="button" class="btn btn-warning">A Button</button>
    @{
    #else
    }
         <p>Nothing to see here</p>
    @{
    #endif
    }

答案 5 :(得分:5)

默认情况下,MVC视图未编译,因此#IF DEBUG无法在视图中工作。如果要编译视图以访问IF DEBUG配置,则需要:

  1. 在Visual Studio中右键单击您的项目
  2. 卸载项目
  3. 修改项目
  4. 将以下属性从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
    }
    

答案 6 :(得分:5)

在.NET Core中,您可以执行以下操作而不是检查预处理器变量:

<environment include="Development">
  <!--Debug code here-->
</environment>

答案 7 :(得分:1)

对我来说,下面的代码效果非常好。

当应用程序调试时,我的按钮出现, 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>
} 

答案 8 :(得分:1)

我的解决方案非常愚蠢,但是可以。 在静态文件中的某处定义全局常量:

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>
}

答案 9 :(得分:1)

我也需要在 <script> 标签中使用类似的东西,并发现以下内容适用于 DOM 中的条件标记或条件脚本。

@{
#if NOEXTAUTH
{
    @:<!-- A single line block of code -->

    <text>
        <!--
        A multi-line block    
        -->
    </text>
}
#endif
}