2013-04-21 42 views
0

(Asp.net 4) 我有一個博客,我使用中繼器向每個博客顯示所有博客文章和評論。我試圖改變用戶如何發表評論到博客。我想將每個博客下的評論放在UpdatePanel中,當他們寫評論並點擊保存按鈕時,我想刷新評論,所以他們的新評論將顯示。但是我很難實現這一點。 我在Repeater的ItemTemplate中添加了UpdatePanel,並添加了用於保存評論的文本框和按鈕。每個UpdatePanel都放在一個帶有博客ID的a中。但是我不知道如何創建代碼來保存正確的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") %> &nbsp;<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);    
     } 

難道我至少接近的東西在這裏,或者完全是我在錯誤的軌道上?

回答

2

您需要使用中繼器的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); 
    } 
}  

這應該讓你開始

+0

非常感謝傑克!我現在應該能夠解決這個:) – 2013-04-21 17:34:56