2009-07-14 104 views
6

Tôi đang cố gắng mã hóa trang mà bạn có thể đăng nhận xét mà không cần tải lại toàn bộ trang. Các bình luận được hiển thị bằng cách sử dụng điều khiển Repeater. Mẫu trông như sau:Làm mới điều khiển lặp lại trong UpdatePanel với 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> 

Chức năng đăng bàiButton_Click() hoạt động tốt khi nhấp vào "Gửi" sẽ tạo bài đăng. Tuy nhiên, tôi cần phải tải lại hoàn toàn trang để xem nhận xét mới - bài đăng mà người dùng vừa tạo sẽ không hiển thị cho đến lúc đó. Tôi Databind the Repeater trong Page_Load() sau khi kiểm tra (! IsPostBack).

Các postCommentButton_Click() chức năng trông như thế này:

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 
     } 
} 

Trong trường hợp của tôi, chúng tôi thấy postCommentFeedback.Text làm mới, nhưng, một lần nữa, không phải là nội dung của bộ lặp mà nên có một bài hơn.

Tôi thiếu gì?

+0

Tôi khá chắc chắn rằng đó là vì DataSource của Repeater của tôi là một MySqlDataReader và tôi không cập nhật nó sau khi người dùng đăng bài của mình. Nó không được cập nhật bởi vì tôi chỉ sử dụng databind nếu (! IsPostBack) ... Cách nào để làm điều này đúng? Tôi nên DataBind trên mỗi Page_Load(), nhưng tôi cần phải DataBind sau khi một bình luận đã được đăng. – Astaar

Trả lời

2

Bạn nên DataBind trong Page_Load trong một IsPostBack như bạn đang có. Bạn cũng nên databind trong sự kiện Click của bạn.

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

Giải pháp không hoạt động. –

0

Thay vì tạo nguồn dữ liệu của bạn thành MySqlDataReader, hãy để người đọc của bạn điền một danh sách BindingList hoặc tương tự như vậy. Giữ nó trong phiên làm việc và làm databind của bạn mỗi không postback và nhấp chuột. Khi người dùng của bạn đăng bài, bạn có thể thêm nó vào danh sách và chờ đợi một cái gì đó để nói với nó để lưu nó, nhưng nó có ý nghĩa hơn trong bối cảnh gửi bình luận để lưu bài của họ vào db của bạn và làm lại datapull của bạn và stomp trên của bạn BindingList và tái Databind.

Ngoài ra, cá nhân peeve: Tôi không thích <% # Eval ....%>. Mã trong trang của bạn thường là dấu hiệu xấu. Hãy thử sử dụng Sự kiện lặp lại.ItemDataBound http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

0

Nghe có vẻ như tôi khắc phục nhanh chóng là ràng buộc khi tải trang bất kể đăng lại. Ngoài ra, bạn có thể rebind từ bên trong postCommentButton_Click.

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

thử đặt các bảng cập nhật giữa các thẻ và nếu bạn đã làm điều đó sau đó kiểm tra nếu việc đóng cửa các thẻ div là thích hợp

Các vấn đề liên quan