2009-07-14 5 views
6

Ich versuche, eine Seite zu codieren, auf der Sie einen Kommentar posten können, ohne die gesamte Seite neu zu laden. Die Kommentare werden mit einem Repeater-Steuerelement angezeigt. Die Vorlage sieht wie folgt aus:Aktualisieren eines Repeater-Steuerelements in einem UpdatePanel mit ASP.NET

<asp:UpdatePanel runat="server" ID="commentsUpdatePanel" UpdateMode="Conditional"> 
     <ContentTemplate> 
     <!-- Comments block --> 
     <div class="wrapper bloc content"> 
      <h3><img src="img/comments.png" alt="Comments" />&nbsp;Comments</h3>          
      <p><asp:Label ID="viewImageNoComments" runat="server" /></p> 
      <asp:Repeater ID="viewImageCommentsRepeater" runat="server"> 
       <HeaderTemplate> 
        <div class="float_box marge wrapper comments"> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <div class="grid_25"> 
         <span class="user"><%#Eval("username")%></span><br /> 
         <span style="font-size:x-small; color:#666"><%#Eval("datetime") %></span> 
        </div> 
        <div class="grid_75"> 
         <p align="justify"><%#Eval("com_text") %></p> 
        </div> 
       </ItemTemplate> 
       <FooterTemplate> 
        </div> 
       </FooterTemplate> 
      </asp:Repeater> 
     </div> 
     <!-- Post comment block --> 
     <div class="wrapper bloc content"> 
      <h3><a id="post_comment" name="post_comment"><img src="img/comment_edit.png" alt="Comments" /></a>&nbsp;Post 
       a comment</h3> 
      <p class="description">Please be polite.</p> 
      <p> 
       <asp:Label ID="postCommentFeedback" runat="server" /> 
      </p> 
      <table border="0"> 
       <tr> 
        <td valign="top"> 
        <asp:TextBox id="postCommentContent" runat="server" TextMode="MultiLine" 
        MaxLength="600" Columns="50" Rows="15" Width="400px" /> 
        </td> 
        <td valign="top"> 
        <span style="font-size:x-small">BBCode is enabled. Usage :<br /> 
        <b>bold</b> : [b]bold[/b]<br /> 
        <i>italic</i> : [i]italic[/i]<br /> 
        <span class="style1">underline</span> : [u]underline[/u]<br /> 
        Link : [url=http://...]Link name[/url]<br /> 
        Quote : [quote=username]blah blah blah[/quote]</span> 
        </td> 
       </tr> 
       <tr> 
        <td colspan="2"> 
        <asp:Button ID="postCommentButton" runat="server" Text="Submit" 
        onclick="postCommentButton_Click" />  
        </td> 
       </tr> 
      </table> 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

Die postCommentButton_Click() Funktion funktioniert gut - Klicken auf „Senden“ wird der Beitrag. Allerdings muss ich die Seite komplett neu laden, um neue Kommentare zu sehen - der Beitrag, den der Nutzer gerade gemacht hat, wird erst dann angezeigt. Ich binde den Repeater in Page_Load() nach einer (! IsPostBack) Prüfung.

Die postCommentButton_Click() Funktion sieht wie folgt aus:

protected void postCommentButton_Click(object sender, EventArgs e) 
{ 
     // We check if user is authenticated 
     if (User.Identity.IsAuthenticated) 
     { 
      // Attempt to run query 
      if (Wb.Posts.DoPost(postCommentContent.Text, Request.QueryString["imageid"].ToString(), User.Identity.Name, Request.UserHostAddress)) 
      { 
       postCommentFeedback.Text = "Your post was sucessful."; 
       postCommentContent.Text = ""; 

      } 
      else 
      { 
       postCommentFeedback.Text = "There was a problem with your post.<br />"; 
      } 

     } 
     // CAPTCHA handling if user is not authenticated 
     else 
     { 
      // CAPTCHA 
     } 
} 

In meinem Fall wir sehen postCommentFeedback.Text aufgefrischt, aber auch hier nicht den Inhalt des Repeaters, die einen weiteren Beitrag haben sollte.

Was fehlt mir?

+0

Ich bin mir ziemlich sicher, dass es ist, weil die Datasource meiner Repeater ein MySqlDataReader ist und ich aktualisiere es nicht, nachdem der Benutzer seinen Beitrag veröffentlicht hat. Es ist nicht aktualisiert, weil ich die Datenbank nur wenn (! IsPostBack) ... Was wäre der richtige Weg, dies dann zu tun? Ich sollte DataBind auf jedem Page_Load(), aber ich muss DataBind, nachdem ein Kommentar veröffentlicht wurde. – Astaar

Antwort

2

Sie sollten das Page_Load innerhalb eines! IsPostBacks so binden, wie Sie es sind. Sie sollten auch in Ihrem Click-Ereignis eine Datenbindung durchführen.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
      this.DataBind(); 
     } 
    } 
    protected void MyButton_Click(object sender, EventArgs e) 
    { 
     //Code to do stuff here... 

     //Re DataBind 
     this.DataBind(); 
    } 
    public override void DataBind() 
    { 
     //Databinding logic here 
    } 
+0

Die Lösung funktioniert nicht. –

0

Statt Ihre Datenquelle ein MySqlDataReader zu machen, haben Ihre Leser einen Binding oder etwas ähnliches füllen. Behalten Sie dies in der Sitzung und machen Sie Ihre Datenbank jedes Nicht-Postback und klicken Sie auf. Wenn Ihr Benutzer Beiträge veröffentlicht, können Sie diese entweder zur Liste hinzufügen und auf etwas warten, um es zu speichern, aber es macht mehr Sinn im Zusammenhang mit dem Posten von Kommentaren, um Ihren Beitrag in Ihrem db zu speichern und Ihren Datenfluss zu wiederholen und über Ihren zu stampfen BindingList und Re-Databind.

Auch persönliche ärgern: Ich mag nicht <% # Eval ....%>. Der Code in Ihrer Seite ist normalerweise ein schlechtes Zeichen. Verwenden Sie das Repeater.ItemDataBound-Ereignis http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

0

Es klingt für mich wie die schnelle Lösung ist beim Laden der Seite unabhängig von Postback zu binden. Alternativ könntest du aus postCommentButton_Click erneut binden.

0
protected void Timer1_Tick(object sender, EventArgs e) 
{ 

     Repeater1.DataBind(); 
      /*This is all I did for it to work.*/ 
} 

protected void Buttontextbox_Click(object sender, EventArgs e) 

{ 

     this.DataBind(); 
    /*Leave sql connection to your database above "this.databind"*/ 

} 
0

versuchen, den Update-Panel zwischen Tags setzen, und wenn Sie bereits getan, dann prüfen, ob die Schließung von div-Tags richtig ist