2016-12-01 4 views
0

J'ai construit un certain nombre de contrôles serveur personnalisés et j'appelle régulièrement les fonctions javascript qui sont intégrées dans mes contrôles. Mais je n'ai pas été capable de comprendre comment créer une propriété à laquelle l'utilisateur du contrôle peut ajouter sa propre fonction et sa fonction javascript dans la page contenant le contrôle sera appelée. Je dois faire quelque chose comme OnClientClick pour un contrôle asp:Button.Contrôles serveur ASP.Net personnalisés: Comment appeler la fonction javascript dans la page parent

Edit 1:

Merci à la réponse par @ H2015 J'ai fait des progrès à ce sujet.

Dans mon contrôle, je crée une propriété publique pour le script de l'utilisateur,

public string EditAddressScript 
{ 
    set 
    { 
    string scriptName = "EditAddressScript"; 
    Type csType = this.GetType(); 
    ClientScriptManager csm = Page.ClientScript; 

    string scriptText = string.Format("function EditAddress() {{{0}}}", value); 

    csm.RegisterClientScriptBlock(csType, scriptName, scriptText, true); 
    } 
} 

Puis dans la section RenderContents de mon contrôle je vérifie si une valeur a été spécifiée pour EditAddressScript et créer un bouton si elle a.

output.Write("<input id='btnEdit' type='button' value='Edit Address' style='font-size: 6pt;' onclick='EditAddress();' />"); 

La page qui utilise ce contrôle crée dynamiquement si je fais quelque chose comme ça,

ECFControls.DefendantAddressReview defendantAddress = new ECFControls.DefendantAddressReview(); 
divControls.Controls.Add(defendantAddress); 
defendantAddress.ClientEditAddressScript = "alert('Hello, World');"; 

Cela fonctionne, mais est loin d'être optimale.

  • Je voudrais définir le script dans la page ASPX et puis juste donner mon contrôle le nom du script, plutôt que de définir la valeur de EditAddressScript au code réel javascript.
  • Dans la section RenderContents du contrôle j'ai le nom du script codé en dur je voudrais que ce soit dynamique.

Edit 2:

D'accord, il semble que je faisais ce beaucoup plus compliqué que nécessaire. Tout ce qui est nécessaire est de créer un script dans la page aspx parent et de définir l'événement dans le contrôle de ce script.

Voilà donc ce que j'ai maintenant

script Ajouter à la page ASPX.

function EditAddress() { 
     alert("Hello, World"); 
    } 

Créer une propriété dans le contrôle pour maintenir la valeur (_EditAddressScript est une variable de chaîne privée dans le contrôle)

public string EditAddressScript 
{ 
    set 
    { 
    _EditAddressScript = value; 
    } 
} 

Puis dans la section RenderContents du contrôle je vérifie si une valeur a été spécifié pour EditAddressScript et créer un bouton si c'est le cas.

 if(_EditAddressScript.Trim() != "") 
      output.Write(string.Format("<input id='btnEdit' type='button' value='Edit' style='font-size: 6pt;' onclick='{0}' />", _EditAddressScript)); 

Créer le contrôle comme celui-ci,

ECFControls.DefendantAddressReview defendantAddress = new ECFControls.DefendantAddressReview(); 
    divControls.Controls.Add(defendantAddress); 
    defendantAddress.EditAddressScript = "EditAddress()"; 

Si le contrôle a été créé, je pouvais le faire déclarative,

 <ECF:DefendantAddressReview ID="defendantAddressReview" runat="server" EditAddressScript="EditAddress()" /> 

Y at-il une meilleure approche?

Merci.

Répondre

0

J'explore deux solutions possibles dans les modifications à ma question initiale. La deuxième édition atteint le résultat souhaité. Je voulais avoir une propriété facultative pour un contrôle de serveur ASP.Net personnalisé qui indiquerait le nom d'une fonction javascript que l'utilisateur du contrôle pourrait placer dans la même page que le contrôle. Voici comment je l'ai fait.

Ajoutez une propriété de chaîne publique au contrôle serveur qui définit le nom de votre fonction javascript. (_CustomJavascript est une variable de chaîne privée dans le contrôle)

public string CustomJavascript 
{ 
    set 
    { 
    _CustomJavascript = value; 
    } 
} 

Puis dans la section RenderContents du contrôle de contrôle si une valeur a été spécifiée pour _CustomJavascript et ajoutez le code à appeler javascript si elle a été. Dans mon cas, je créais un contrôle composite et je voulais un bouton d'édition à afficher qui appelle la fonction javascript de l'utilisateur.

if(_CustomJavascript.Trim() != "") 
     output.Write(string.Format("<input id='btnEdit' type='button' value='Edit' style='font-size: 6pt;' onclick='{0}' />", _CustomJavascript)); 

Tout l'utilisateur doit faire est d'écrire leur fonction.

function EditAddress() { 
    alert("Hello, World"); 
} 

Et donner le nom de leur fonction à la propriété CustomJavascript lors de la déclaration du contrôle.

<cc:AddressReview ID="addressReview" runat="server" CustomJavascript="EditAddress()" /> 
0

this.Page.ClientScript.Register ...

https://msdn.microsoft.com/en-us/library/ms178207.aspx

+0

Merci, @ h2015. J'ai déjà utilisé cette famille de méthodes, mais il ne semblait pas qu'elles aient été la solution. Je les ai examinés plus en profondeur et j'ai ajouté une solution quelque peu réalisable à ma question initiale. – John