2009-11-26 7 views
23

Estoy intentando utilizar una directiva de preprocesador en una página ASPX, pero la página no lo reconoce. ¿Es esto algo que no puedo hacer?#DEBUG Declaraciones de preprocesador en la página ASPX

Antecedentes: Estoy tratando de incluir la versión completa de jQuery en modo DEBUG (para, bueno, depuración =)), y la versión minificada para su lanzamiento. Intenté esto, pero no estoy muy familiarizado con la sintaxis ASPX <%. ¿Acabo de entender fundamentalmente lo que hace esta sintaxis?

<% #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 el título podría ampliarse un poco para atraer más atención –

Respuesta

14

diferencia interesante aquí - usando #if DEBUG en la página aspx tira de la etiqueta en el web.config, pero cuando se utiliza en el código subyacente, que tira de depuración de la constante de la configuración de compilación en el archivo de proyecto. Por lo tanto, están accediendo a dos diferentes configuraciones de.

Por lo tanto, hasta donde puedo decir, esto no es realmente posible.

+1

"De modo que están accediendo a dos configuraciones diferentes". Sí. Esto se debe a que los archivos ASPX son compilados por el tiempo de ejecución de ASP.NET, mientras que el proyecto DLL es compilado por Visual Studio. – Alex

+0

¡Gracias por la respuesta! Sería bueno con la sintaxis web.config :) –

1

Probé tu código, y funcionó bien para mí. Activaba o desactivaba DEBUG desde la sección system.web/compilation en web.config, ejecutándose como un sitio web (no se evaluó como una aplicación web, podría ser diferente ...).

Para ver lo que hace ese código, coloque un error de sintaxis intencional en la página e intente ejecutarlo con el modo de depuración habilitado. El compilador generará un enlace en la página de error que le permitirá ver la fuente.

Sugerencia: las directivas del preprocesador son insertadas en la salida.

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 

Por supuesto, hay otras maneras (mejor) a hacer lo que está buscando ...

+0

Y las mejores formas son? –

+0

Aquí hay una diferencia interesante: si #if DEBUG en la página aspx se extrae de la etiqueta en web.config, pero cuando lo utiliza en el código subyacente, tira DEBUG de la constante desde la configuración de compilación en el archivo de proyecto. Entonces, en realidad están accediendo a dos configuraciones diferentes. – Badjer

+1

@Sean: el OP no pidió alternativas, pero en general es mejor mantener el marcado en el archivo .aspx y el código en el código subyacente, por lo que una alternativa es hacer algo así como crear una propiedad JquerySrc que contenga el lógica condicional, úsela para establecer la propiedad src de la etiqueta del script con <% = JquerySrc%>. Si el código se reutiliza con frecuencia, también puede convertirlo en un control de usuario. – RickNZ

-2

no creo que puede tener directivas del preprocesador en el aspx por desgracia.

Una forma más sencilla de hacerlo es simplemente tener una propiedad en su código subyacente que alimenta la URL de jQuery, entonces puede configurar las directivas de preprocesador para declararla. O, si prefiere mantener la URL en el código frontal, podría usar un control Literal y alternar su visibilidad en el código subyacente en función de las directivas del procesador.

Por ejemplo:

código-enfrente:

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

de código subyacente, en el método Page_Load:

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

Un mejor enfoque puede ser el uso de código del lado del servidor para incluir la secuencia de comandos. que haría uso de algo así como

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

Aquí está mi solución:

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

Me trataron de lograr esto muchas maneras a lo largo de los años sin ningún éxito. Después de jugar con asp.net mvc recientemente, tengo esta idea. Existe otra posibilidad de mantenerlo todo en página aspx utilizando tipos MIME no válidos. En asp.net MVC, las plantillas se cargan con tipos de MIME no válidos, de modo que el navegador no los analizará. Seguí el mismo patrón aquí; Wola! Éxito ... Necesita una función estática que le permita acceder fácilmente a la restricción de depuración.

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

Ops.IsRelease() es la función estática pública que devuelve el constaraint depuración

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

que tenía el mismo problema, he intentado resolverlo, tanto en la aplicación de solicitud y formulario web asp.mvc. La depuración #if siempre devuelve verdadero, nunca tiene en cuenta la configuración de compilación web.config. Lo resuelto en forma similar a los consejos Syam publicado en este post, pero en lugar de la función estática utilizo variables astatcic como se describe aquí: http://www.psworld.pl/Programming/DebugDirective

3

Para mí sería la solución más elegante para definir simplemente un campo en el código subyacente con las directivas del preprocesador y luego verifique su valor desde la página aspx.

En código subyacente:

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

página 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" /> 
<%}%> 
Cuestiones relacionadas