sintaxis referencia programacion microsoft lenguaje informacion documentacion comandos codigos basicos c# asp.net c-preprocessor

c# - referencia - #DEBUG declaraciones del preprocesador en la página ASPX



referencia de c# microsoft (8)

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 el modo DEBUG (para, bueno, depuración =)), y la versión minified para el lanzamiento. Intenté esto, pero no estoy muy familiarizado con la sintaxis de ASPX <%. ¿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 %>


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


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

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


No creo que puedas tener directivas de preprocesador en el aspx desafortunadamente.

Una forma más sencilla de hacerlo es simplemente tener una propiedad en su código subyacente que se alimenta en la URL de jQuery, luego puede configurar las directivas de preprocesador para declararla. O si prefiere mantener la URL en el código anterior, 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


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

En el código detrás:

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

Página de 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í. He habilitado o deshabilitado DEBUG en la sección system.web / compilation en web.config, ejecutando como un sitio web (no probé como una aplicación web; podría ser diferente ...).

Para ver qué hace ese código, ponga 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 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. Existe otra posibilidad de mantenerlo todo en la página aspx utilizando tipos MIME no válidos. En asp.net MVC, las plantillas se cargan con tipos MIME no válidos, de modo 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 estática pública que devuelve constaraint de depuración

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, traté de resolverlo tanto en la aplicación asp.mvc como en la aplicación webform. La depuración #if siempre devuelve true, nunca toma 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 la variable astatcic como se describe aquí: http://www.psworld.pl/Programming/DebugDirective


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