2009-11-26 16 views
23

Sto provando a utilizzare una direttiva del preprocessore in una pagina ASPX, ma la pagina non la riconosce. È solo qualcosa che non posso fare?#DEBUG Istruzioni del preprocessore nella pagina ASPX

Background: Sto cercando di includere la versione completa di jQuery in modalità DEBUG (per, beh, debugging =)) e la versione minified per la versione. Ho provato questo, ma non ho molta familiarità con la sintassi ASPX <%. Sto semplicemente fraintendendo ciò che questa sintassi fa?

<% #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

+1 il titolo potrebbe essere esteso un po 'per attirare più attenzione –

risposta

14

differenza interessante qui - usando #if DEBUG nella pagina aspx tira dal tag nel web.config, ma quando lo si utilizza nel code-behind, tira DEBUG dalla costante dalla configurazione di build nel file di progetto. Quindi stanno effettivamente accedendo a due diverse impostazioni.

Quindi, per quanto posso dire, questo non è effettivamente possibile.

+1

"Quindi stanno effettivamente accedendo a due impostazioni diverse." Sì. Questo perché i file ASPX sono compilati dal runtime di ASP.NET, mentre la DLL del progetto è compilata da Visual Studio. – Alex

+0

Grazie per la risposta! Sarebbe bello con la sintassi web.config in esso :) –

1

Ho provato il codice e ha funzionato bene per me. Ho abilitato o disabilitato DEBUG dalla sezione system.web/compilation in web.config, eseguito come sito web (non testato come applicazione web, potrebbe essere diverso ...).

Per vedere cosa fa quel codice, inserire un errore di sintassi intenzionale nella pagina e provare ad eseguirlo con la modalità di debug abilitata. Il compilatore genererà un link nella pagina di errore che ti permetterà di visualizzare la fonte.

Suggerimento: le direttive del preprocessore sono inserite nell'output.

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 

Naturalmente, ci sono altri (migliore) modi per fare quello che stai dopo ...

+0

E i modi migliori sono? –

+0

Interessante differenza qui - usando #if DEBUG nella pagina aspx si estrae dal tag nel web.config, ma quando lo si utilizza nel code-behind, estrae DEBUG dalla costante dalla configurazione di build nel file di progetto. Quindi stanno effettivamente accedendo a due impostazioni diverse. – Badjer

+1

@Sean: l'OP non ha richiesto alternative, ma in generale è meglio mantenere il markup nel file .aspx e codice nel code-behind, quindi un'alternativa è fare qualcosa come creare una proprietà JquerySrc che contiene il logica condizionale, utilizzala per impostare la proprietà src del tag script con <% = JquerySrc%>. Se il codice viene riutilizzato spesso, puoi anche trasformarlo in un controllo utente. – RickNZ

-2

non credo che si può avere direttive del preprocessore nel aspx purtroppo.

Un modo più semplice per andare è semplicemente avere una proprietà nel code-behind che alimenta l'URL jQuery, quindi è possibile impostare le direttive del preprocessore per dichiararlo. Oppure, se preferisci mantenere l'URL nel codice-infront, puoi utilizzare un controllo letterale e attivare la visibilità nel code-behind in base alle direttive del processore.

Ad esempio:

Codice-Infront:

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

code-behind, nel metodo Page Load:

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

Un approccio migliore potrebbe essere quella di utilizzare il codice lato server per includere il copione. userei qualcosa di simile

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

Ecco la mia soluzione:

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"); 
    } 
} 
0

ho cercato di raggiungere questo molti modi nel corso degli anni con qualsiasi successo. Dopo aver giocato a con asp.net mvc recentemente ho avuto questa idea. C'è un'altra possibilità di mantenere tutto nella pagina aspx usando tipi MIME non validi. In asp.net MVC, i modelli vengono caricati con tipi MIME non validi, in modo che il browser non li analizzi. Ho seguito lo stesso schema qui; Wola! Successo ... È necessaria una funzione statica che consente di accedere facilmente al vincolo di debug.

<script src='<%= Page.ResolveUrl("~/Scripts/jquery-1.5.2.min.js") %>' 
    **type='<%=if(Ops.IsRelease(),"text/javascript","HideMin")%>'**></script> 

Ops.IsRelease() è pubblica funzione statica che restituisce il constaraint di debug

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

Ho avuto lo stesso problema, ho cercato di risolverlo sia in applicazione delle applicazioni e moduli elettronici asp.mvc. Il debug #if restituisce sempre true, non prende mai in considerazione l'impostazione della compilazione web.config. Ho risolto in modo simile alla consulenza Syam scritto in questo post, ma invece di funzione statica che uso variabile astatcic come descritto qui: http://www.psworld.pl/Programming/DebugDirective

3

Per me la soluzione più elegante sarebbe quella di definire semplicemente un campo in code-behind con le direttive del preprocessore e quindi verificare il suo valore dalla pagina aspx.

Nel code-behind:

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

pagina 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" /> 
<%}%> 
Problemi correlati