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
}