Domanda

Sto cercando di usare una direttiva preprocessore in una pagina ASPX, ma la pagina non la riconosce. È solo qualcosa che non posso fare?

Background: sto cercando di includere la versione completa di jQuery in modalità DEBUG (per, beh, debugging =)) e la versione minimizzata per il rilascio. Ho provato questo, ma non ho molta familiarità con la sintassi ASPX & Lt;%. Sto fondamentalmente fraintendendo cosa fa questa sintassi?

<% #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 %>
È stato utile?

Soluzione

La differenza interessante qui - l'uso di #if DEBUG nella pagina aspx estrae dal tag in web.config, ma quando lo usi nel code-behind, estrae DEBUG dalla costante dalla configurazione di compilazione nel file di progetto . Quindi stanno effettivamente accedendo a due diverse impostazioni.

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

Altri suggerimenti

Un approccio migliore potrebbe essere l'uso del codice lato server per includere lo script. Userei qualcosa come

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
}

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

In 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" />
<%}%>

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

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

Suggerimento: le direttive pre-processore 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 (migliori) modi per fare ciò che stai cercando ...

Ho cercato di raggiungere questo obiettivo in molti modi nel corso degli anni senza alcun successo. Dopo aver giocato con asp.net mvc recentemente ho avuto questa idea. C'è un'altra possibilità per tenerlo tutto dentro pagina aspx che utilizza tipi MIME non validi. In asp.net MVC, i modelli sono caricati con MIME non valido  tipi, in modo che il browser non li analizzi. Ho seguito lo stesso modello qui; Wola! Successo ... È necessaria una funzione statica che ti dia un facile accesso 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 () è Funzione statica pubblica 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

Ho avuto lo stesso problema, ho provato a risolverlo sia nell'applicazione asp.mvc che nell'applicazione webform. Il debug #if restituisce sempre true, non tiene mai conto dell'impostazione della compilazione web.config. L'ho risolto in modo simile ai consigli di Syam pubblicati in questo post, ma invece della funzione statica utilizzo la variabile astatcica come descritto qui: http://www.psworld.pl/Programming/DebugDirective

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

Sfortunatamente non posso avere delle direttive sul preprocessore nell'aspx.

Un modo più semplice di procedere è semplicemente avere una proprietà nel code-behind che si nutre nell'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 loro 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top