Question

J'essaie d'utiliser une directive de préprocesseur dans une page ASPX, mais cette page ne la reconnaît pas. Est-ce juste quelque chose que je ne peux pas faire?

Contexte: j'essaie d'inclure la version complète de jQuery en mode DEBUG (pour, eh bien, le débogage =)), ainsi que la version simplifiée pour la publication. J'ai essayé cela, mais je ne connais pas très bien la syntaxe ASPX & Lt;%. Suis-je fondamentalement en train de mal comprendre ce que cette syntaxe fait?

<% #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 %>
Était-ce utile?

La solution

Différence intéressante ici - utiliser #if DEBUG dans la page aspx extrait de la balise dans le fichier web.config, mais lorsque vous l'utilisez dans le code-behind, il extrait DEBUG de la constante dans la configuration de construction du fichier de projet. . Ils accèdent donc à deux différents paramètres.

Ainsi, autant que je sache, cela n’est pas réellement possible.

Autres conseils

Une meilleure approche consiste peut-être à utiliser un code côté serveur pour inclure le script. J'utiliserais quelque chose comme

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
}

Pour moi, la solution la plus élégante serait simplement de définir un champ dans code-behind avec des directives de préprocesseur, puis de vérifier sa valeur à partir de la page aspx.

Dans code-behind:

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

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

J'ai essayé votre code, et cela a bien fonctionné pour moi. J'ai activé ou désactivé DEBUG à partir de la section system.web / compilation de web.config, exécuté en tant que site Web (le test n'a pas été effectué en tant qu'application Web; il pourrait être différent ...).

Pour voir ce que fait ce code, insérez une erreur de syntaxe intentionnelle dans la page et essayez de l'exécuter avec le mode débogage activé. Le compilateur générera un lien sur la page d'erreur qui vous permettra d'afficher la source.

Conseil: les directives du préprocesseur sont insérées dans le résultat.

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

Bien sûr, il existe d’autres (meilleurs) moyens de faire ce que vous recherchez ...

J'ai essayé de réaliser cela de nombreuses manières au fil des années sans succès. Après avoir joué avec asp.net mvc récemment, j'ai eu cette idée. Il y a une autre possibilité de tout garder dans page aspx utilisant des types MIME non valides. Dans asp.net MVC, les modèles sont chargés avec MIME non valide.  types, de sorte que le navigateur ne les analysera pas. J'ai suivi le même schéma ici; Wola! Succès ... Vous avez besoin d’une fonction statique qui vous donne un accès facile à la contrainte de débogage.

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

Ops.IsRelease () est une fonction statique publique qui renvoie la constante de débogage

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

J'ai eu le même problème, j'ai essayé de le résoudre à la fois dans l'application asp.mvc et dans l'application webform. Le débogage #if renvoie toujours true, il ne prend jamais en compte le paramètre de compilation web.config. Je l'ai résolu de la même manière que le conseil Syam publié dans ce message, mais au lieu d'une fonction statique, j'utilise une variable astatcique comme décrit ici: http://www.psworld.pl/Programming/DebugDirective

Voici ma solution:

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

Je ne pense pas que vous puissiez malheureusement avoir de directives de préprocesseur dans l'aspx.

Une méthode plus simple consiste simplement à avoir une propriété dans votre code-behind qui se nourrit dans l'URL jQuery. Vous pouvez ensuite définir les directives du préprocesseur pour la déclarer. Ou, si vous préférez conserver l’URL dans le code inférieur, vous pouvez utiliser un contrôle Literal et basculer leur visibilité dans le code secondaire (code-behind) en fonction des directives du processeur.

Par exemple:

code-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, dans la méthode Page_Load:

#if DEBUG
litJQueryDebug.Visible=true;
litJQuery.Visible=false;
#endif
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top