L'actualisation d'un contrôle Repeater dans un UpdatePanel avec ASP.NET
Je suis en train de coder une page où vous pouvez poster un commentaire sans avoir à recharger la page entière. Les commentaires sont affichés à l'aide d'un contrôle Repeater. Le modèle ressemble à ceci:
<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>
La postCommentButton_Click() fonctionne très bien - en cliquant sur "Soumettre" vous permettra de la poste. Cependant, j'ai besoin de recharger complètement la page pour voir les nouveaux commentaires - poste de l'utilisateur ne sera pas montrer jusqu'alors. Je Databind la Répétition dans le Page_Load() après une (!isPostBack) vérifier.
La postCommentButton_Click() la fonction ressemble à ceci:
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
}
}
Dans mon cas, nous ne voyons postCommentFeedback.Texte actualisé, mais, encore une fois, pas le contenu de la répétition qui devrait avoir un poste plus.
Qu'est-ce que je suis absent?
- Je suis assez sûr que c'est parce que la source de données de mon Répéteur est un MySqlDataReader, et je n'ai pas la mettre à jour après que l'utilisateur a fait son post. Il n'est pas mis à jour car je ne l'databind seulement si(!IsPostBack)... Ce serait la bonne façon de le faire alors? Je devrais DataBind sur chaque Page_Load(), mais j'ai besoin de DataBind après un commentaire a été posté.
Vous devez vous connecter pour publier un commentaire.
Vous devriez DataBind dans le Page_Load dans un !IsPostBack que vous êtes. Vous devez ÉGALEMENT databind dans votre événement Click.
Au lieu de faire de votre source de données d'un MySqlDataReader, votre lecteur de remplir une BindingList ou quelque chose comme ça. Gardez cela à l'session et de faire de votre databind tous les non-publication et cliquez sur. Lorsque vos messages de l'utilisateur, vous pouvez l'ajouter à la liste et attendre que quelque chose à dire sauf que, mais il fait plus de sens dans le contexte de poster des commentaires pour sauver leur poste à votre base de données et refaire votre datapull et piétiner sur votre BindingList et re-Databind.
Également une bête noire: je n'aime pas les <%#Eval....%>. Code dans votre page est généralement un mauvais signe. Essayez d'utiliser la Répétition.ItemDataBound Événement
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx
Il me semble que la solution est de se lier au chargement de la page, indépendamment de la publication. Sinon, vous pouvez les relier à partir de l'intérieur de postCommentButton_Click.
essayez de mettre le panneau de mise à jour entre les balises et si vous l'avez déjà fait, puis vérifiez si la fermeture des balises div est bon