(Asp.net 4)我有一个博客,我用一个重复器来显示所有的博客文章和每个博客的评论。我正在尝试改变用户在博客上发表评论的方式。我想把评论放在每个博客的UpdatePanel下,当他们写评论并点击保存按钮时,我想刷新评论,这样他们的新评论就会显示出来。但我很难做到这一点。我在Repeater的ItemTemplate中添加了UpdatePanel,并添加了用于保存注释的文本框和按钮。每个UpdatePanel都放置在带有博客id的列表中。但是我不知道如何创建代码来保存正确的blog-id的评论,然后刷新UpdatePanel。
代码:<asp:Repeater ID="RepeaterBlog" runat="server">
<ItemTemplate>
<article>
<% if (repeaterCounter == 0)
{
Response.Write("<header class="firstArticleInBlog">");
}
else
{
Response.Write("<header class="normalArticle">");
}
%>
<h2><%# Eval("article_header") %> <span class="date">
<time datetime="<%# GetPubDate(Eval("article_date")) %>"><%# FormatDate(Eval("article_date")) %></time></span></h2></header>
<p><%# Eval("article_content") %><p><br />
<div class="comments">
<div class="showhidecomments">
<!--<a class="iframe-comments" data-fancybox-type="iframe" href='WriteComments.aspx?BlogId=<%# DataBinder.Eval(Container, "DataItem.id") %>'>Skriv kommentar</a> | -->
<a href="javascript:void(0);" title="i<%# Eval("id") %>">Vis/Skriv kommentarer (<%# CountComments (DataBinder.Eval(Container, "DataItem.id")) %>)</a> | <a href="javascript:void(0);" title="i<%# Eval("id") %>" >Skjul kommentarer</a>
</div>
<section>
<article>
<div id="i<%# Eval("id") %>" style="display: none;">
<asp:UpdatePanel ID="upPanel" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="cmdSaveComment" EventName="Click" />
</Triggers>
<ContentTemplate>
<%# GetComments (DataBinder.Eval(Container, "DataItem.id")) %>
<asp:TextBox ID="txtName" runat="server" />
<asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" />
<asp:Button ID="cmdSaveComment" runat="server" OnClick="cmdSaveComment_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</article>
</section>
</div>
<% repeaterCounter++; %>
</article>
</ItemTemplate>
</asp:Repeater>
在代码后面:
protected void cmdSaveComment_Click(object sender, EventArgs e)
{
//simplified code:
string name = txtName.Text;
string comment = txtComment.Text;
int blogId = (int)(Eval("DataItem.id"));
dataHandler.NewComment(name, comment, blogId);
}
我至少接近了一些东西,还是我完全走错了轨道?
您需要为重复器使用ItemCommand属性,为按钮使用CommandName属性。
首先在aspx中声明重复器的事件名称和按钮的命令名称。注意,CommandName替换了按钮的OnClick。您还可以为按钮提供一个命令参数,这是评论所针对的文章记录的ID。
<asp:Repeater ID="RepeaterBlog" runat="server" OnItemCommand="RepeaterBlog_ItemCommand">
<asp:Button ID="cmdSaveComment" runat="server" CommandName="SaveComment" CommandArgument='<%# Eval("id")%>' />
现在在
后面的代码中添加这个void RepeaterBlog_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
if(e.CommandName == "SaveComment") {
string name = ((TextBox)e.Item.FindControl("txtName")).Text;
string comment = ((TextBox)e.Item.FindControl("txtComment")).Text;
dataHandler.NewComment(name, comment, e.CommandArgument);
}
}
这应该可以让你开始了