2009-07-22 12 views
2

J'ai des problèmes pour appeler un popup modal du côté serveur. Donc, je mets le targetcontrolID de modalpopupextender à une étiquette cachée. Ensuite, dans le codebehind à partir du clic d'un bouton, j'essaie d'ajouter this.modalpopup.show(); Malheureusement, la fenêtre contextuelle modale n'apparaît pas lorsque cela se produit. Je peux voir le code s'exécuter, mais rien ne se voit.AJAX Toolkit Modal Popup n'apparaîtra pas

Voici mon ASP. moins l'ouverture < pour le bouton et popupextender, car pour une raison quelconque ces lignes ne seront pas affichées.

<asp:Button CssClass="Button" ID="button" runat="server" Text="Button" AccessKey="m" meta:resourcekey="buttonResource1" OnClick="button_Click" /> 

<ajaxToolkit:ModalPopupExtender ID="mpe" runat="server" TargetControlID="forpopup" 
      PopupControlID="PopupPanel" BackgroundCssClass="modalBackground" /> 

     <asp:Label ID="forpopup" runat="server" Visible="False"></asp:Label> 

     <asp:panel id="PopupPanel" runat="server" BorderStyle="Groove" BorderColor="black" BorderWidth="3px" BackColor="AliceBlue" Height="200px" Width="200px" style="display: none"> 

      <asp:Label ID="lblPopup" runat="server" Text="popup!"></asp:Label><br /> 
      <br /> 
      <asp:DropDownList ID="ddlData" runat="server"> 
      </asp:DropDownList><br /> 
      <br /> 

      <asp:Button ID="btnPopupOK" runat="server" Text="Ok" /> 
      <asp:Button ID="btnPopupCancel" runat="server" Text="Cancel" /> 
     </asp:panel>  

et voici mon codebehind

protected void button_Click(object sender, EventArgs e) 
    { 
     this.mpe.Show(); 
    } 
+0

Je ne suis pas sûr que vous ayez besoin du style: display = none. Mais, pouvez-vous également afficher le code de l'extension contextuelle? De plus, avec l'extension, vous pouvez le pointer sur un bouton pour afficher le popup sans avoir à utiliser le code derrière. –

+0

l'affichage = none empêche le popup d'apparaître sur le chargement, puis de disparaître. Pratique standard. –

+0

s'il vous plaît modifier pour afficher la définition de l'extension popup ... peut-être votre problème est là. –

Répondre

1

ajouter généralement tout type d'extensions après les boutons/panneaux/commandes, ils vont modifier. Je n'ai rien vu directement dans les guides au sujet des contrôles qui indiquent qu'ils doivent aller de cette façon, mais j'ai rencontré trop de problèmes quand j'ai mis les extensions avant les contrôles.

Essayez de placer l'extension après le panneau et le (s) bouton (s) concerné (s) et voyez si cela résout les problèmes.

+0

J'ai essayé de le déplacer à la dernière chose avant, mais toujours pas de dés:/ –

+0

Hmmm dites-vous ... Avez-vous imbriqué dans un UpdatePanel ou quelque chose aussi? Si oui, vous voudrez aussi publier ce code, puisque l'imbrication de ces choses peut facilement affecter ce qui fonctionne et ce qui ne fonctionne pas –

2

Selon le ASP.NET AJAX ModalPopup documentation

TargetControlID est l'ID de l'élément qui active le modal pop-up.

Dans votre exemple de code, TargetControlID est réglé sur un Label ID="forpopup", mais dans le code-behind vous essayez de montrer l'ModalPopup en utilisant un gestionnaire d'événements de clic pour Button ID="button".

Avez-vous essayé de changer le TargetControlID en "button" et de voir si le ModalPopup apparaît?

Quelques notes

  • Quel est le but d'utiliser Label ID="forpopup" pour le TargetControlID?
  • Label ID="forpopup" ne sera pas rendu en HTML sur le client.

EDIT:

Code de démonstration pour montrer utilisation-

page de contenu ASPX

<asp:Content ID="Content1" ContentPlaceHolderID="Main" runat="server">  
    <asp:Button ID="btnShow" runat="server" Text="Open ModalPopup" />  

    <ajaxToolkit:ModalPopupExtender runat="server" ID="modal" BackgroundCssClass="darken" 
    CancelControlID="btnCancel" PopupControlID="pnl" TargetControlID="btnShow" /> 

    <asp:Panel ID="pnl" runat="server" style="width:55%;display:none;"> 
     <h1>You can now see me!</h1> 
     <p>"Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
     sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
     Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 
     nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in 
     reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 
     pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 
     culpa qui officia deserunt mollit anim id est laborum."</p> 
     <asp:Button ID="btnCancel" runat="server" Text="Close" /> 
    </asp:Panel> 
</asp:Content> 

code-behind

protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     btnShow.Click += new EventHandler(btnShow_Click); 
    } 

    protected void btnShow_Click(object sender, EventArgs e) 
    { 
     modal.Show(); 
    } 
+0

Salut, le problème avec la définition de TargetControl est que la popup est appelée côté client, donc mon autre fonctions sous le bouton cliquer ne fonctionnent pas. C'est là où il est dit de le mettre à un contrôle caché. http://www.asp.net/AJAX/AjaxControlToolkit/Samples/ModalPopup/ModalPopup.aspx Ce ModalPopup est créé par programmation. Le ModalPopupExtender auquel cette fenêtre contextuelle est attachée a un TargetControl masqué. La fenêtre contextuelle peut être affichée via le serveur dans le code derrière et sur le client dans le script en appelant les méthodes ModalPopupExtender à afficher et masquer. –

+0

si le ModalPopup est appelé côté client, puis définissez un attribut OnClientClick pour votre bouton ASP pour exécuter une fonction JavaScript pour obtenir le popup modal par ID puis appelez sa fonction show() –

0

Je suis d'accord avec Dillie-O , Je pense que tu le feras besoin d'un panneau de mise à jour là-bas si vous invoquez à partir du Serverside:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <asp:panel id="PopupPanel" runat="server" BorderStyle="Groove" BorderColor="black" BorderWidth="3px" BackColor="AliceBlue" Height="200px" Width="200px" style="display: none"> 
    ... 
    </asp:panel> 
</ContentTemplate> 
</asp:UpdatePanel> 

puis

protected void button_Click(object sender, EventArgs e) 
{ 
    this.mpe.Show(); 
    UpdatePanel1.Update(); 
} 
+0

J'ai testé cela et un UpdatePanel n'est pas nécessaire - Si TargetControlID est défini correctement, la publication est interceptée et une publication asynchrone est effectuée à la place, ce qui exécute le code côté serveur et renvoie un résultat qui entraîne l'affichage de ModalPopup. –

+0

@Russ Cam, Ce que vous dites est vrai, SI le TargetControlID est le contrôle que vous utilisez pour activer le popup. Dans cette question ce n'est pas le cas, @ashtame active le popup du codebehind, non? –

9

J'ai eu un problème similaire ..Je définissais le targetcontrolid de l'extension à un bouton caché et essayait de déclencher l'événement Show() dans le code côté serveur. Il n'était pas affiché même si le code était touché. J'ai découvert que le problème était que je cachais le bouton caché en utilisant "visible = false" qui ne rend pas le contrôle à la page. Je l'ai changé en "style = 'display: none'" et ça a commencé à fonctionner. Essayez de changer votre contrôle de cible en un bouton caché et assurez-vous qu'il est rendu (juste non montré) et peut-être cela fonctionnera.

+0

wow. Cela a merveilleusement bien fonctionné. Merci! –

+0

J'ai pris note de ceci dans ma réponse car je pensais que cela pourrait être pertinent –

+0

Je me souviens d'avoir déjà eu ce problème! Bonne prise Cody! –

0

Veuillez définir l'attribut BehaviourID de ModalPopupExtender avec une certaine valeur, puis vous pourrez afficher et masquer le popup modal.

0

j'ai eu des problèmes avec le Popup Modal ne pas afficher lorsque le bouton TargetControlID avait

UseSubmitBehavior="false" 

Set à « vrai » et voir si cela résout votre problème. Si cela fonctionne, et en supposant que vous ne vouliez pas soumettre le bouton, vous devrez peut-être empêcher le bouton de soumettre le formulaire lorsque vous ne le souhaitez pas.

Questions connexes