Обновление элемента управления Repeater в UpdatePanel с ASP.NET - PullRequest
6 голосов
/ 14 июля 2009

Я пытаюсь закодировать страницу, на которой вы можете оставить комментарий, не перезагружая всю страницу. Комментарии отображаются с использованием элемента управления Repeater. Шаблон выглядит так:

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

Функция postCommentButton_Click () работает просто отлично - нажатие кнопки «Отправить» приведет к публикации. Тем не менее, мне нужно полностью перезагрузить страницу, чтобы увидеть новые комментарии - пост, который только что сделал пользователь, не будет отображаться до тех пор. Я связываю повторитель в Page_Load () после проверки (! IsPostBack).

Функция postCommentButton_Click () выглядит следующим образом:

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

В моем случае мы видим, что postCommentFeedback.Text обновлен, но, опять же, не содержимое ретранслятора, который должен иметь еще один пост.

Чего мне не хватает?

Ответы [ 5 ]

2 голосов
/ 14 июля 2009

Вы должны DataBind в Page_Load внутри! IsPostBack, как и вы. Вы также должны привязать данные в вашем событии Click.

    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 голосов
/ 25 сентября 2014

попробуйте поместить панель обновления между тегами, и если вы уже сделали это, проверьте правильность закрытия тегов div

0 голосов
/ 06 сентября 2014
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 голосов
/ 14 июля 2009

Мне кажется, что быстрое решение - привязать загрузку страницы независимо от обратной передачи. Кроме того, вы можете выполнить повторную привязку из postCommentButton_Click.

0 голосов
/ 14 июля 2009

Вместо того, чтобы делать ваш источник данных MySqlDataReader, попросите вашего читателя заполнить BindingList или что-то в этом роде. Держите это в сеансе и делайте ваши данные, связывайте каждую не-обратную передачу и нажимайте. Когда ваш пользователь публикует сообщения, вы можете либо добавить его в список и подождать, пока что-то скажет, чтобы сохранить это, но в контексте публикации комментариев более разумно сохранять свои посты в вашей БД и переделывать ваш файл данных и топать по вашему BindingList и повторная привязка данных.

Кроме того, личная раздражительность: мне не нравится <% # Eval ....%>. Код на вашей странице, как правило, плохой знак. Попробуйте использовать событие Repeater.ItemDataBound http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...