Est-il possible d’interpoler ma cornière, pourcentage, égale à la syntaxe dans des fichiers JavaScript externes?

Souvent, lors du mélange de jQuery avec asp.net, je dois utiliser la syntaxe asp .net, pourcentage de crochet, , dans un sélecteur jQuery.

Si je souhaite séparer le code JavaScript des balises JavaScript en différents fichiers, existe-t-il encore un moyen d’évaluer mon fichier JavaScript afin que les pourcentages de chevrons soient interpolés avant d’atteindre le navigateur client?

Si vous souhaitez évaluer <% code blocks %> tant que code ASP.NET dans un fichier JavaScript, vous pouvez simplement placer le code JavaScript dans un fichier ASPX et le référencer à partir d’un élément SCRIPT.

script.js.aspx :

 function hideElements() { <% foreach(var elementId in Request.QueryString["hide"].Split(',') { %> jQuery('#' + <%= elementId %>).hide('slow'); <% } %> } 

page.aspx :

  

page.aspx.cs :

 public ssortingng GetElementIds() { return ssortingng.Join(",", new []{control1.ClientID, control2.ClientID}); } 

Non, vous devez modifier votre JavaScript pour accepter ces informations en tant que parameters.

Donc, au lieu de

 jQuery('#<%=MainPanel.ClientId%>').hide('slow'); 

faire quelque chose comme ça:

 function hidePanel(panelId) { jQuery('#' + panelId).hide('slow'); } 

que vous pouvez appeler depuis votre page avec

 hidePanel('<%=MainPanel.ClientId%>'); 

Vous pouvez également gérer les fichiers .js en tant que fichiers .aspx; Ainsi, vous ne perdrez pas l’intellisense et le formatage du code lorsque vous les éditez. Ajoutez simplement ceci à web.config:

    

J’ai tenté de séparer javascript du contrôle utilisateur de la grid de recherche du code HTML du fichier .ascx. Lors de la première itération, j’ai utilisé la fonction jQuery (document) .onReady pour attacher mon initialisation.

Le problème, c’est que les balises <% =%> utilisées dans les sélecteurs jQuery n’ont pas été interpolées correctement et que les contrôles sur lesquels javascript a été activé n’ont pas été trouvés avec les sélecteurs jQuery.

Ensuite, j’ai essayé de créer un object json lors de l’initialisation de la page et de l’écrire à l’aide de la méthode asp.net Page.ClientScript.RegisterClientScriptBlock. Cela a fonctionné, mais avec des inconvénients: câblé en dur le nom et les clés de l’object json dans le fichier asp.net et le fichier javascript. Ceci est désavantageux car il existe maintenant “deux points de vérité” à maintenir et, de plus, il existe un potentiel de collision de noms dans la page finale.

La solution la plus élégante dans asp .net et utilisant jQuery est de créer un comportement de script ajax en javascript. Ensuite, dans asp codebehind, enregistrez les propriétés du comportement du script dans la méthode GetScriptDescriptors () de l’interface IScriptControl, en ajoutant l’ID client au contrôle du serveur en tant que propriété du descripteur de script.

 // Ajax Javacsript Code below: Type.registerNamespace('SearchGrid'); // Define the behavior properties // ButtonBehavior = function() { ButtonBehavior.initializeBase(this); this._lnkSearchID = null; } // Create the prototype for the behavior // // SearchGrid.ButtonBehavior.prototype = { initialize: function() { SearchGrid.ButtonBehavior.callBaseMethod(this, 'initialize'); jQuery('#' + this._lnkSearchID).click(function() { alert('We clicked!'); }); }, dispose: function() { SearchGrid.ButtonBehavior.callBaseMethod(this, 'dispose'); jQuery('#' + this._lnkSearchID).unbind(); } } // Register the class as a type that inherits from Sys.Component. SearchGrid.ButtonBehavior.registerClass('SearchGrid.ButtonBehavior', Sys.Component); if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 

Code Asp .Net ci-dessous:

  public partial class SearchGrid : System.Web.UI.UserControl, IScriptControl { // Initialization protected override void OnPreRender(EventArgs e) { if (!this.DesignMode) { // Test for ScriptManager and register if it exists ScriptManager sm = ScriptManager.GetCurrent(Page); if (sm == null) throw new ApplicationException("A ScriptManager control must exist on the current page."); sm.RegisterScriptControl(this); } base.OnPreRender(e); } protected override void Render(HtmlTextWriter writer) { if (!this.DesignMode) sm.RegisterScriptDescriptors(this); base.Render(writer); } // IScriptControl Members public IEnumerable GetScriptDescriptors() { ScriptBehaviorDescriptor desc = new ScriptBehaviorDescriptor("SearchGrid.ButtonBehavior", this.ClientID); desc.AddProperty("lnkSearchID", this.lnkSearch.ClientID); yield return desc; } public IEnumerable GetScriptReferences() { ScriptReference reference = new ScriptReference(); reference.Path = ResolveClientUrl("SearchGrid.ButtonBehavior.js"); return new ScriptReference[] { reference }; } } 

L’avantage ici est que vous pouvez créer des contrôles réutilisables autonomes avec un comportement javascript contenu dans son propre fichier séparé (ou en tant que ressource Web) tout en transmettant l’état et le contexte, qui pourraient sinon être interpolés avec la syntaxe angle, pourcentage, égale à, nécessaire jQuery pour faire son travail.