2010-06-01 66 views
44

我有一个条件编译符号,我使用名为“RELEASE”,我在Visual Studio中的项目属性中指出。我想在定义RELEASE符号时将一些特定的CSS应用于元素,并且我试图从视图中执行该操作,但似乎并不奏效。C#和ASP.NET MVC:在视图中使用#if指令

我的观点的代码如下所示(简称有点用于演示目的):

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

有了这个代码,并与RELEASE符号集,“别人的代码运行,我得到一个div与debugBanner类。所以它似乎并不认为RELEASE是定义的。值得注意的是,我的.cs文件中的实际C#代码识别RELEASE并运行正确的代码。这只是给我提出问题的观点。

有没有人有这方面的见解?任何帮助,将不胜感激。谢谢。

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

Html.RenderPartial("BannerView");

它不工作。

+3

为什么你不创建一个html助手方法,并把你的代码放在那里? 然后你可以做if和做一个渲染partial来保留HTML – Rippo 2010-06-01 15:43:21

+0

不太熟悉html helper方法。我确实澄清了我的问题,以表明这是我正在使用的部分视图。你能否详细说明一下你的建议? – 2010-06-01 15:47:57

+1

预处理器指令仅适用于编译时工作... @DeveloperArt有一个优雅的解决方案... – xandercoded 2010-06-01 15:53:03

回答

17

在你的模型:

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> 
<% } %> 
+0

我从这个答案中收集到,不可能从视图中检查编译符号,并且必须从.cs文件完成。这是真的? – 2010-06-01 15:52:45

+0

不错的解决方案,但是如何将这个逻辑放置在所有控制器继承的基础控制器中。然后,你可以通过所有的控制器访问这个属性... – xandercoded 2010-06-01 15:56:20

+1

好吧,不知道这将完全工作的xander。要从视图中访问它,我们需要一个具有该属性的模型,而不是具有该属性的控制器。所以我真的必须从多个控制器中传递相同的模型并呈现该视图,这将是一种痛苦。 – 2010-06-01 16:01:26

104

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

HttpContext.Current.IsDebuggingEnabled 
在浏览

,这样可以节省检查应用程序其他部分的符号。

+1

这是最好的方法,国际海事组织。 – 2014-01-06 19:02:22

+2

不应该使用'this.Context.IsDebuggingEnabled'来代替吗?真的只适用于你嘲笑的上下文或以某种方式[在Web应用程序外使用剃刀视图](http://stackoverflow.com/questions/3628895/is-it-possible-to-use-razor-view-engine- outside-asp-net) – drzaus 2014-08-05 16:30:41

-7

下面是条件编译器指令的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 
} 
+1

不认为这将工作,因为视图没有编译,如果(DEBUG)是编译器指令? – Tom 2012-08-03 09:45:03

+1

这在Razor中不起作用。这正是原来的问题。 – trailmax 2012-08-08 13:41:53

57

一个更好的,更通用的解决方案是使用一个扩展方法,因此,所有的观点有机会获得它:

public static bool IsReleaseBuild(this HtmlHelper helper) 
{ 
#if DEBUG 
    return false; 
#else 
    return true; 
#endif 
} 

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

@if(Html.IsReleaseBuild()) 
... 
+1

这真是太棒了!感谢分享! – trailmax 2012-08-08 13:39:04

+1

当然,需要注意的是,它取决于此方法的位置 - 如果它处于已在发布模式下编译的共享库中,则它将在以调试模式编译的项目中包含时返回“false”。 – drzaus 2014-08-05 16:39:29

+0

请检查这个问题http://stackoverflow.com/questions/28400135/public-conditional-razor-views-with-minified-js-and-css – chemitaxis 2015-02-08 22:34:06

9
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
    // Debug mode enabled. Your code here. Texts enclosed with <text> tag 
} 
3

可以使用ViewBag而不是视图模型(但视图模型式的方法更好):

控制器:

controller code

查看:

@{ 
    bool hideYoutubeVideos = ViewBag.hideYoutubeVideos ?? false;  
} 

用法:

@if (!hideYoutubeVideos) 
{ 
    <span>hello youtube</span> 
} 

而且,可以肯定的,那NIKITA_DEBUG变量在项目的生成选项卡存在:

build tab

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