dmr
dmr

Reputation: 22323

UpdatePanel sometimes refreshing entire page

Even though I am using an update panel, sometimes my entire page is refreshed, and I can't figure out why.

(Edited to take into account Jason P's answer.)

Masterpage code:

<form runat="server" id="form1">
        <asp:ScriptManager ID="ScriptManager1" runat="server" enablePartialRendering="true" />

        <h1>Title</h1>

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="conditional" childrenAsTriggers="true">
            <ContentTemplate>
                <ul class="letterLinks">
                    <asp:Repeater runat="server" ID="Letter_Repeater">
                      <ItemTemplate>
                          <li id='<%#Eval("Letter")%>'> 
                              <asp:LinkButton runat="server" ID="UpdateLink"  Text="My Text" 
                            CommandName="BookLetter" CommandArgument='<%#Eval("Letter")%>' OnCommand="LoadBookTitles"/>
                           </li>
                    </ItemTemplate>
                   </asp:Repeater>
                </ul>
                <ul class="BookList">
                    <asp:Repeater runat="server" ID="Title_Repeater">
                        <ItemTemplate>
                            <li><a href='<%#Eval("URL")%>'><%#Eval("Title")%></a></li>
                        </ItemTemplate>
                    </asp:Repeater>
                </ul>
            </ContentTemplate>    
        </asp:UpdatePanel> 
        </form>

Code Behind:

public partial class MyBooks : System.Web.UI.MasterPage
{
    private GetAllBookInfo setMyInfo = new GetAllBookInfo();
    private DataTable allTitleInfo = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
        List<string> lettersWithBooks = new List<string>(); 
        DataTable letterLinks = new DataTable();

        // Get all letters that have Books
        lettersWithBooks = setMyInfo.LettersWithBooks();

        // get properties for ABC links
        letterLinks = GetLetterLinkProperties(lettersWithBooks);

        // Bind abc link data to the ABC repeater
        Letter_Repeater.DataSource = letterLinks;
        Letter_Repeater.DataBind();

        allTitleInfo = setMyInfo.GetBookTitles(lettersWithBooks[0]);

        // Bind title info data to title repeater 
        Title_Repeater.DataSource = allTitleInfo;
        Title_Repeater.DataBind();
    }

    private DataTable GetLetterLinkProperties(List<string> letters)
    {
        DataTable letterLinks = new DataTable();
        letterLinks.Columns.Add("Letter", typeof(string));
        letterLinks.Columns.Add("Class", typeof(string));
        letterLinks.Columns.Add("Enabled", typeof(bool));

        for (char c = 'A'; c <= 'Z'; c++)
        {
            if (letters.Any(letter => letter == c.ToString()))
            {
                letterLinks.Rows.Add(c, "hasGuides", true);
            }
            else
            {
                letterLinks.Rows.Add(c, "noGuides", false);
            }
        }
        return letterLinks;

    protected void LoadBookTitles(object sender, EventArgs e)
    {
        LinkButton letterLink = (LinkButton)sender;

        allTitleInfo = setMyInfo.GetBookTitles(letterLink.CommandArgument as String);

        // Bind title info data to title repeater 
        Title_Repeater.DataSource = allTitleInfo;
        Title_Repeater.DataBind();
    }
}

Upvotes: 2

Views: 900

Answers (1)

Jason P
Jason P

Reputation: 27012

Not sure if this is the entire problem, but the <Triggers> element should be on the same level as the <ContentTemplate> element, not a child:

<asp:UpdatePanel>
    <Triggers>
        ...
    <Triggers>
    <ContentTemplate>
        ...
    <ContentTemplate>
</asp:UpdatePanel>

Also, I believe in this case, the Repeater should be the trigger, not the LinkButton. Try removing the OnCommand event from the LinkButton and adding it to the Repeater, and changing the UpdatePanel's Trigger.

Upvotes: 2

Related Questions