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 查询