Pregunta

Estoy tratando de usar una directiva de preprocesador en una página ASPX, pero la página no lo reconoce. ¿Es esto algo que no puedo hacer?

Antecedentes: estoy tratando de incluir la versión completa de jQuery en modo DEBUG (para, bueno, depuración =)), y la versión reducida para el lanzamiento. Intenté esto, pero no estoy muy familiarizado con la sintaxis ASPX & Lt;%. ¿Estoy malinterpretando 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 %>
¿Fue útil?

Solución

Diferencia interesante aquí: el uso de #if DEBUG en la página aspx extrae de la etiqueta en web.config, pero cuando lo usa en el código subyacente, extrae DEBUG de la constante de la configuración de compilación en el archivo del proyecto . Por lo tanto, en realidad están accediendo a dos configuraciones diferentes .

Por lo tanto, por lo que puedo decir, esto no es realmente posible.

Otros consejos

Un mejor enfoque puede ser utilizar el código del lado del servidor para incluir el script. Yo usaría algo 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
}

Para mí, la solución más elegante sería simplemente definir un campo en código subyacente con directivas de preprocesador y luego verificar 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" />
<%}%>

Probé su código, y funcionó bien para mí. Habilité o deshabilité DEBUG desde la sección system.web / compilation en web.config, ejecutándome como un sitio web (no probé como una aplicación web; podría ser diferente ...).

Para ver qué 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 de preprocesador se insertan 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 (mejores) formas de hacer lo que buscas ...

Traté de lograr esto de muchas maneras a lo largo de los años sin ningún éxito. Después de jugar con asp.net mvc recientemente tuve esta idea. Hay otra posibilidad de mantener todo dentro página aspx con tipos MIME no válidos. En asp.net MVC, las plantillas se cargan con MIME no válido  tipos, para que el navegador no los analice. 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 una función pública estática que devuelve la depuración constante

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

Tuve el mismo problema, intenté resolverlo tanto en la aplicación asp.mvc como en la aplicación de formulario web. La depuración #if siempre devuelve verdadero, nunca tiene en cuenta la configuración de compilación web.config. Lo resolví de manera similar a los consejos de Syam publicados en esta publicación, pero en lugar de la función estática, uso una variable astatcic como se describe aquí: http://www.psworld.pl/Programming/DebugDirective

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

No creo que pueda tener directivas de preprocesador en aspx desafortunadamente.

Una forma más sencilla de hacerlo es simplemente tener una propiedad en su código subyacente que se alimente en la URL de jQuery, luego puede establecer directivas de preprocesador para declararla. O, si prefiere mantener la URL en el código, puede usar un control Literal y alternar su visibilidad en el código subyacente según las directivas del procesador.

Por ejemplo:

código-delante:

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

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

#if DEBUG
litJQueryDebug.Visible=true;
litJQuery.Visible=false;
#endif
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top