J'ai fait une tentative de séparer le javascript sur le contrôle de l'utilisateur du réseau de recherche à partir du html dans le fichier .ascx. Lors de la première itération, j'ai utilisé la fonction jQuery (document) .onReady pour attacher mon initialisation. Le problème avec ceci est que <% =%> les balises utilisées dans les sélecteurs jQuery n'ont pas été interpolées correctement et les commandes sur lesquelles le javascript a été utilisé n'ont pas été trouvées avec les sélecteurs jQuery.
Ensuite, j'ai tenté de créer un objet json dans l'initialisation de la page et de l'écrire en utilisant la méthode asp.net Page.ClientScript.RegisterClientScriptBlock. Cela a bien fonctionné, mais avec des inconvénients: le nom et les clés de l'objet json dans le fichier asp.net et le fichier javascript. Ceci est désavantageux car maintenant il existe "deux points de vérité" à maintenir et plus encore il y a un risque de collision de noms dans la page finale.
La solution la plus élégante au sein d'asp .net et l'utilisation de jQuery consiste à créer un comportement de script ajax en javascript. Ensuite, dans le code aspbebehind, inscrivez les propriétés du comportement du script dans la méthode GetScriptDescriptors() de l'interface IScriptControl, en ajoutant le ClientID du contrôle côté serveur en tant que propriété au 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();
Asp Code .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<ScriptDescriptor> GetScriptDescriptors()
{
ScriptBehaviorDescriptor desc = new ScriptBehaviorDescriptor("SearchGrid.ButtonBehavior", this.ClientID);
desc.AddProperty("lnkSearchID", this.lnkSearch.ClientID);
yield return desc;
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
ScriptReference reference = new ScriptReference();
reference.Path = ResolveClientUrl("SearchGrid.ButtonBehavior.js");
return new ScriptReference[] { reference };
}
}
L'avantage est que vous pouvez créer des contrôles réutilisables autonomes avec javascript comportement contenu dans son propre fichier séparé (ou une ressource web) tout en passant l'état et le contexte, qui pourraient sinon être interpolés avec l'angle, le pourcentage, la syntaxe égale, nécessaire pour que jQuery fasse son travail.
qui nécessite encore le mélange de javascript et de balisage. Ce que j'essaie d'éviter. J'utilise l'événement $ (document) .onReady de jQuery pour connecter le reste de mes gestionnaires, éliminant ainsi le besoin de mélanger le balisage et le script. – eniac