我今天正在写我的第一个Razor页面,不知道如何进入

#if debug
...
#else
...
#endif

我如何在Razor中做到这一点?


当前回答

我需要在<script>标记中工作的类似内容,并发现以下内容对于DOM中的条件标记或条件脚本都工作得很好。

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

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

其他回答

c#和ASP。NET MVC:在视图中使用#if指令

实际上这个答案是正确的。无论是否通过Model处于调试模式,都必须传递。(或ViewBag),因为所有视图都是在调试模式下编译的。

这适用于我的。net Core 3.0白色标签项目:

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

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

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

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符号编译的,所以它可以工作。

这是内置在HttpContext中的:

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

在我看来,这比视图的条件编译更有意义,而且在一些测试场景中很方便。(请看下面托尼·沃尔的评论。)


旁注:HttpContext的NullReferenceException。当前的

Alex Angas提到,他们用这个解决方案得到了一个NullReferenceException,一些人已经投了赞成票,表明这可能不是一个孤立的事件。

我的最佳猜测是:HttpContext。Current存储在CallContext中,这意味着只有处理传入HTTP请求的线程才能访问它。如果你的视图在不同的线程上被呈现(也许是一些预编译视图的解决方案?),你会得到HttpContext.Current的空值。

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