C# 和 ASP.NET MVC:在视图中使用 #if 指令

Posted

技术标签:

【中文标题】C# 和 ASP.NET MVC:在视图中使用 #if 指令【英文标题】:C# and ASP.NET MVC: Using #if directive in a view 【发布时间】:2011-02-26 10:12:41 【问题描述】:

我使用了一个名为“RELEASE”的条件编译符号,我在 Visual Studio 的项目属性中指出了它。我希望在定义 RELEASE 符号时将一些特定的 CSS 应用于元素,我试图从视图中执行此操作,但它似乎不起作用。

我的视图代码如下所示(为了演示目的,稍微缩短了一点):

<% #if (RELEASE) %>
    <div class="releaseBanner">Banner text here</div>
<% #else %>
    <div class="debugBanner">Banner text here</div>
<% #endif %>

使用此代码和 RELEASE 符号集,'else' 代码正在运行,我得到一个带有 debugBanner 类的 div。所以似乎没有定义 RELEASE 。值得注意的是,我在 .cs 文件中的实际 C# 代码正在识别 RELEASE 并运行正确的代码。只是观点给我带来了问题。

有人对此有任何见解吗?任何帮助,将不胜感激。谢谢。

澄清:我应该提到这个视图已经是一个局部视图,我将在需要它的页面中简单地呈现它。那是因为这些横幅将出现在某些页面上,而不是其他页面上。因此,即使通过以下方式将其渲染为局部视图:

html.RenderPartial("BannerView");

它不工作。

【问题讨论】:

你为什么不创建一个 html 辅助方法并将你的代码放在那里呢?然后,您可以执行 if 并执行部分渲染以保留 HTML 对 html 辅助方法不太熟悉。我确实澄清了我的问题,以表明这是我正在使用的部分观点。你能详细说明一下你的建议吗? 预处理器指令仅在编译时工作...@DeveloperArt 有一个优雅的解决方案... 将关键字“constant”添加到此页面,以便在搜索“编译器常量”时返回。 (希望) 请参阅:***.com/a/8325519/204699,了解在视图中使用条件编译的另一种方法。 【参考方案1】:

在您的模型中:

bool isRelease = false;

<% #if (RELEASE) %>
    isRelease = true;
<% #endif %>

在你看来:

<% if (Model.isRelease)  %>
    <div class="releaseBanner">Banner text here</div>
<%  else  %>
    <div class="debugBanner">Banner text here</div>
<%  %>

【讨论】:

我从这个答案中得知,无法从视图中检查编译符号,而这必须从 .cs 文件中完成。这是真的吗? 不错的解决方案,但是如何将此逻辑放在所有控制器都继承的基本控制器中。然后你就可以通过所有控制器访问这个属性了... 好吧,不确定这是否能完全奏效。要从视图中访问它,我们需要一个具有该属性的模型,而不是具有该属性的控制器。所以我真的必须从多个控制器传递同一个模型并渲染那个视图,这会有点痛苦。 如果您将该逻辑放在基本控制器中并从派生控制器访问它,那么您可以将其分配给ViewData 或一些自定义ViewModel 所以实际上,我要做的是在我们的一个全局文件中设置一个属性,这应该可以解决问题。与 Develop Art 的解决方案相同的一般原则,但略有调整。感谢您的回复。【参考方案2】:

最近发现你可以简单地测试:

HttpContext.Current.IsDebuggingEnabled

在视图中,这可以让您在应用的其他部分检查符号。

【讨论】:

这是最好的方法,IMO。 你不应该改用this.Context.IsDebuggingEnabled吗?仅当您嘲笑上下文或以某种方式used razor views outside of a webapp 时才真正适用【参考方案3】:

以下是条件编译器指令的 Razor 语法。当在 VS 配置文件或 web.config 中设置 DEBUG 变量时,它会加载 jquery 的开发人员版本。否则会加载最低版本。

    @
#if (DEBUG)
    
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.js"></script>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js"></script>
    @    
#else
    
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
       <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js"></script>
    @
#endif
    

【讨论】:

不认为这会起作用,因为视图没有被编译并且 if(DEBUG) 是编译器指令? 这在 Razor 中不起作用。这正是最初的问题。 我编辑了帖子以匹配当前的 razor sytnax,这个答案是针对的。这不是“经典的 ASP”语法,而是“ASP.NET Web Pages (Razor) 3”,我相信这是当前的语法。 您需要重新编译视图,而且它似乎也不能始终如一地工作,所以最好使用 Helper 方法。【参考方案4】:

更好、更通用的解决方案是使用扩展方法,这样所有视图都可以访问它:

public static bool IsReleaseBuild(this HtmlHelper helper)

#if DEBUG
    return false;
#else
    return true;
#endif

然后您可以在任何视图中使用它,如下所示(剃刀语法):

@if(Html.IsReleaseBuild())
...

【讨论】:

当然,需要注意的是它取决于这个方法在哪里——如果它在一个以发布模式编译的共享库中,它会在包含在项目中时返回false在调试模式下编译。 请检查这个问题***.com/questions/28400135/… 这个方法应该放在哪里?在控制器中?单独的课程?【参考方案5】:
@if (HttpContext.Current.IsDebuggingEnabled)

    // Debug mode enabled. Your code here. Texts enclosed with <text> tag

【讨论】:

【参考方案6】:

您可以使用 ViewBag 代替 viewmodel(但类似 viewmodel 的方法更好):

控制器:

查看:

@
   bool hideYoutubeVideos = ViewBag.hideYoutubeVideos ?? false;     

用法:

@if (!hideYoutubeVideos)

     <span>hello youtube</span>

另外,请确保 NIKITA_DEBUG 变量存在于项目的构建选项卡中:

【讨论】:

【参考方案7】:

对我来说,下面的代码运行良好。当应用在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>
 

【讨论】:

【参考方案8】:

你可以像这样使用Debugger.IsAttached:

@using System.Diagnostics

@
    string gridID = $"the-grid-7";

    if (Debugger.IsAttached)
        gridID = gridID + new Random().Next(1, 1000).ToString();

    var loadUrl = ViewBag.LoadUrl;

【讨论】:

以上是关于C# 和 ASP.NET MVC:在视图中使用 #if 指令的主要内容,如果未能解决你的问题,请参考以下文章

通过 ASP.NET MVC 在 C# 视图中遍历匿名对象的嵌套 LINQ 查询

在 asp.net core 5 MVC 视图中从 C# 代码调用 JavaScript 函数

asp.net mvc视图中的C#复选框事件不在表单内

ASP.NET MVC & C#:将视图模型传递给控制器

ASP.NET MVC 视图和控制器输出缓存

如何在 ASP.NET MVC 视图中用 C# 打印出 GridView?