ASPX页面中的#DEBUG预处理语句

26

我正尝试在ASPX页面中使用预处理指令,但页面无法识别它。这是我无法做到的事情吗?

背景:我正在尝试在DEBUG模式下包含完整版本的jQuery(用于调试=),并在发布时使用压缩版本。我尝试了这个方法,但我对ASPX <% 语法不是很熟悉。我是否根本误解了这种语法的作用?

<% #if DEBUG %>
<script type="text/javascript" src="resources/jquery-1.3.2.js" />
<% #else %>
<script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
<% #endif %>

1
标题可以稍微扩展一下以吸引更多关注。 - Mark Rogers
8个回答

18

有一个有趣的差异 - 在 aspx 页面中使用 #if DEBUG 会从 web.config 文件的 <compilation> 标记中获取,但是当你在代码后台中使用它时,它会从项目文件中构建配置的常量 DEBUG 中获取。因此,实际上它们访问了不同的设置。

因此,据我所知,这实际上是不可能的。


2
"所以他们实际上正在访问两个不同的设置。" 是的。这是因为ASPX文件由ASP.NET运行时编译,而项目DLL是由Visual Studio编译的。 - Alex from Jitbit
谢谢你的回答!如果能附上web.config的语法就更好了 :) - Anders Lindén

7

对我来说,最优雅的解决方案是在代码后端使用预处理指令定义一个字段,然后从aspx页面检查其值。

在代码后端:

public partial class WebClient : System.Web.UI.Page
{        
#if DEBUG 
    public bool DebugMode = true;
#else
    public bool DebugMode = false;
#endif
}

ASPX页面:

<%if(this.DebugMode){%>
    <script type="text/javascript" src="resources/jquery-1.3.2.js" />
<%}%>
<%else{%>
    <script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
<%}%>

最简单的解决方案。 - smile.al.d.way

6
更好的方法可能是使用服务器端代码来包含脚本。 我会使用类似以下的代码:
protected void Page_Load(object sender, EventArgs e)
{
#if DEBUG    
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.js");
    #else
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.min.js");
    #endif
}

1

我尝试了你的代码,对我来说运行得很好。我在web.config文件的system.web/compilation部分启用或禁用了DEBUG,作为一个网站运行(没有测试作为Web应用程序;可能会有所不同...)。

要查看该代码的功能,请在页面中放置一个故意的语法错误,并尝试在调试模式下运行它。编译器将在错误页面上生成一个链接,允许您查看源代码。

提示:预处理器指令已插入输出中。

Line 218:     #if DEBUG 
Line 219:              
Line 220:              #line default
Line 221:              #line hidden
Line 222:              @__w.Write("\r\n<script type=\"text/javascript\" src=\"resources/jquery-1.3.2.js\" />\r\n");
Line 223:              
Line 224:              #line 14 "F:\Test\test.aspx"
Line 225:     #else 
Line 226:              
Line 227:              #line default
Line 228:              #line hidden
Line 229:              @__w.Write("\r\n<script type=\"text/javascript\" src=\"resources/jquery-1.3.2.min.js\" />\r\n");
Line 230:              
Line 231:              #line 16 "F:\Test\test.aspx"
Line 232:     #endif

当然,有其他(更好的)方法来实现你想要的东西...

有趣的差异在于 - 在aspx页面中使用#if DEBUG会从web.config文件中的<compilation>标签中提取,但是当你在代码后台中使用它时,它会从项目文件中的构建配置常量DEBUG中提取。因此,它们实际上访问了两个不同的设置。 - Badjer
1
@Sean:OP并没有要求提供其他选择,但通常最好将标记保留在.aspx文件中,将代码放在code-behind中。因此,其中一个替代方案是创建一个包含条件逻辑的JquerySrc属性,使用它来设置带有<%= JquerySrc %>的脚本标签的src属性。如果该代码经常被重用,则可以将其转换为用户控件。 - RickNZ

0
多年来,我尝试了许多方法都没有成功。最近玩了一下asp.net mvc后,我有了这个想法。还有另一种可能性,就是使用无效的MIME类型将所有内容保留在aspx页面中。在asp.net MVC中,模板使用无效的MIME类型加载,以便浏览器不会解析它们。我在这里遵循了相同的模式;哇!成功了...你需要一个静态函数,可以轻松访问调试约束。
<script src='<%= Page.ResolveUrl("~/Scripts/jquery-1.5.2.min.js") %>' 
    **type='<%=if(Ops.IsRelease(),"text/javascript","HideMin")%>'**></script> 

Ops.IsRelease() 是一个公共静态函数,它返回调试约束。

    Public Shared Function IsRelease() As Boolean
        Dim [release] = False
#If Not debug Then
        [release]=True
#End If
        Return [release]
    End Function

0

我曾经遇到过同样的问题,我尝试在asp.mvc应用程序和webform应用程序中解决它。#if debug总是返回true,它从不考虑web.config编译设置。我以类似于Syam在这篇文章中提供的建议的方式解决了它,但我使用了一个静态变量而不是静态函数,如此处所述: http://www.psworld.pl/Programming/DebugDirective


-1

这是我的解决方案:

protected void Page_Load(object sender, EventArgs e)
{
    if (System.Diagnostics.Debugger.IsAttached)
    {
        ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.js");
    }
    else
    {
        ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.min.js");
    }
}

-2

很遗憾,我认为在aspx中无法使用预处理器指令。

一个更简单的方法是在你的代码后台中有一个属性来提供jQuery URL,然后你可以设置预处理器指令来声明它。或者如果你更喜欢将URL保留在代码前端,你可以使用Literal控件,并根据处理器指令在代码后台切换它们的可见性。

例如:

代码前端:

<asp:literal id="litJQuery" EnableViewState="false" runat="Server">
<script type="text/javascript" src="resources/jquery-1.3.2.js" />
</asp:literal>
<asp:literal id="litJQueryDebug" EnableViewState="false" Visible="false" runat="Server">
<script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
</asp:literal>

在Page_Load方法中的code-behind:

#if DEBUG
litJQueryDebug.Visible=true;
litJQuery.Visible=false;
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接