2011-07-26 4 views
1

Scénario
Dans le cadre d'une page « Voir cas » il devrait y avoir une fonction pour ajouter une nouvelle note de cas.
Une note de cas peut être "visible de l'extérieur" avec l'option de fournir un texte "externe" différent. Ce que j'ai fait, est d'utiliser un ModalPopupExtender de la boîte à outils ASP.NET Ajax Control qui se déclenche lorsque le bouton 'Ajouter une note' est cliqué, pour montrer un panneau avec une zone de texte pour entrer la nouvelle note. Il y a un CheckBox sous la zone de texte que l'utilisateur peut cocher si la note est disponible en externe.Après ModalPopup fermé, jQuery cesse de fonctionner

Lorsque tic tac, certains jQuery devrait tirer, qui se fane dans la case « contenu de la note publique » et pré-ensembles à la valeur de la zone de texte «contenu de la note.

Une fois le texte public saisi, l'utilisateur doit cliquer sur "Enregistrer la note". La note est écrite dans la base de données, le GridView des notes est rebondi et le ModalPopup se cache.

Le jQuery est référencé une fois, sur Page_Load comme suit.

ScriptManager.RegisterClientScriptInclude(Me, Me.GetType, "BensJQuery", Page.ResolveUrl("~/include/BensJquery.js")) 

Problème:
L'utilisateur pourrait vouloir ensuite ajouter une deuxième note. Ils cliquent à nouveau sur 'Ajouter une note', le ModalPopupExtender montre à nouveau le popup modal. Cette fois, s'ils cliquent sur la case 'Disponible en externe', le jQuery ne se déclenche PAS. La zone de contenu de la note publique ne s'affiche pas. Le test alert() ne s'affiche pas.

Le même problème se produit si l'utilisateur clique sur « Annuler » et n'ajoute pas une note. Le ModalPopup va disparaître, mais ils ne peuvent pas l'utiliser correctement s'ils essaient d'ajouter une note par la suite.

Markup

<asp:UpdatePanel ID="updNotes" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:GridView ID="gvNotes" runat="server" AllowPaging="true" PageSize="10" AutoGenerateColumns="false" Width="100%"> 
      <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" /> 
      <Columns> 
       <asp:BoundField HeaderText="Date" DataField="CreationDate" /> 
       <asp:BoundField HeaderText="Author" DataField="CreatedBy" /> 
       <asp:BoundField HeaderText="Note" DataField="Text" ItemStyle-Width="80%" /> 
      </Columns> 
     </asp:GridView>         

     <p><asp:Button ID="btnAddNewNote" runat="server" Text="Add note" CssClass="addButton" CausesValidation="false" /></p> 

     <asp:Panel ID="pnlNewNote" runat="server" GroupingText="New note" style="display: none;" CssClass="mdlPopupPanel"> 
      <p>To add a new note, enter the note information here and click 'Add note'</p> 

      <scc:TextBox runat="server" ID="txtNewNoteContent" TextMode="MultiLine" CssClass="mainNoteContent input" 
      Rows="6" Width="75%" Label="Text" ValidationGroup="NewNote" /> 

      <p> 
       <asp:CheckBox ID="chkMakeAvailExternally" CssClass="chkAvailExternally" runat="server" /> 
       <asp:Label runat="server" Text=" Note is available to public" AssociatedControlID="chkMakeAvailExternally" /> 
      </p> 

      <div class="publicNoteContent" style="display: none;"> 
       <scc:TextBox ID="txtPublicNoteContent" runat="server" Label="Text to show to public" 
       TextMode="MultiLine" Rows="6" Width="75%" CssClass="publicNoteContent input" Required="false" /> 
      </div> 

      <p> 
       <asp:Button ID="btnSaveNote" runat="server" CssClass="confirmButton" Text="Save note" ValidationGroup="NewNote" /> 
       <asp:Button ID="btnCancelAddNote" runat="server" CssClass="cancelButton" Text="Cancel" CausesValidation="false" /> 
      </p> 

     </asp:Panel>  
     <act:ModalPopupExtender ID="mpopNewNote" runat="server" TargetControlID="btnAddNewNote" PopupControlID="pnlNewNote" /> 

    </ContentTemplate> 
</asp:UpdatePanel> 

jQuery

$(document).ready(function() { 
    $(".chkAvailExternally").click(function (event) { 
     alert('test'); // This alert displays for the first note added but not subsequent notes 

     var publicNoteDiv = $(this).parent().parent().find('div.publicNoteContent'); 

     if (publicNoteDiv.is(":visible")) { 
      publicNoteDiv.fadeOut(); 
     } 
     else { 
      var existingText = publicNoteDiv.parent().find('textarea.mainNoteContent').text(); 
      if (publicNoteDiv.find('textarea.publicNoteContent').text() == '') { 
       publicNoteDiv.find('textarea.publicNoteContent').text(existingText); 
      } 
      publicNoteDiv.fadeIn(); 
     } 
    });  
}); 

code-behind

Protected Sub btnSaveNote_Click(sender As Object, e As System.EventArgs) Handles btnSaveNote.Click 
    Dim CaseRef As String = Request("CaseReference") 
    Using ctx As New CAMSEntities 
     Dim c As [Case] = ctx.Cases.Single(Function(x) x.Reference = CaseRef) 

     c.AddNote(txtNewNoteContent.Text, chkMakeAvailExternally.Checked, txtPublicNoteContent.Text) 

     ctx.SaveChanges() 

     gvNotes.DataSource = c.Notes.OrderByDescending(Function(x) x.CreationDate).ToList 
     gvNotes.DataBind() 

     txtNewNoteContent.Text = String.Empty 
     chkMakeAvailExternally.Checked = False 
     txtPublicNoteContent.Text = String.Empty 
    End Using 
End Sub 

Répondre

2

Au lieu d'utiliser directement $(".chkAvailExternally").click(, utilisez $(".chkAvailExternally").live("click",function(){..

Lire à ce sujet here et here. Fondamentalement, la deuxième fois pour le popup modal, les éléments ne font plus partie de DOM, vous devez donc attacher un gestionnaire d'événements pour ceux-ci.

Mise à jour: Après en avoir lu plus, il serait peut-être préférable d'utiliser un delegate au lieu de live pour réduire la portée. Plus d'info here.

Questions connexes