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" /> 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> 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?
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