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

时间:2009-11-26 01:00:14

标签: c# asp.net c-preprocessor

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

背景:我正在尝试在DEBUG模式中包含完整版本的jQuery(for,well,debugging =)),以及用于发布的缩小版本。我尝试过这个,但我对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 %>

8 个答案:

答案 0 :(得分:16)

这里有趣的区别 - 在aspx页面中使用#if DEBUG来自web.config中的标签,但是当你在代码隐藏中使用它时,它会从项目文件中的构建配置中的常量中提取DEBUG 。所以他们实际上正在访问两个不同的设置。

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

答案 1 :(得分: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
}

答案 2 :(得分:4)

对我来说,最优雅的解决方案是使用预处理程序指令在代码隐藏中定义一个字段,然后从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" />
<%}%>

答案 3 :(得分: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

当然,还有其他(更好的)方法可以做你想要的事情......

答案 4 :(得分:0)

多年来,我试图通过多种方式取得成功。玩完之后 最近我有了asp.net mvc这个想法。还有另一种可能性 aspx页面使用无效的MIME类型。在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()是公共静态函数,它返回调试constaraint

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

答案 5 :(得分:0)

我有同样的问题,我试图在asp.mvc应用程序和webform应用程序中解决它。 #if调试始终返回true,它从不考虑web.config编译设置。我用与本文中发布的Syam建议类似的方式解决了它,但是我使用的是astatcic变量而不是静态函数: http://www.psworld.pl/Programming/DebugDirective

答案 6 :(得分:-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");
    }
}

答案 7 :(得分:-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方法中:

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