Matthew Scerri
Matthew Scerri

Reputation: 325

Updatepanel in ascx refreshing the whole control

I've got a sitecore proejct, in which I have prepared a sub-layout in the form of an ascx User Control. I need to set up cascading drop downs in this user control, and based on what I found an UpdatePanel is the way to go. The problem is that the UpdatePanel seems to be refreshing the whole control, which I don't think is the correct behaviour.

I understand there are some similar questions on SO, but none of the solutions worked for me. I'm also beginning to suspect that this may be a Sitecore specific issue.

Here is a code sample of the user control:

    <p><%= MyItem.Text %>" /></p>

    <asp:UpdatePanel ID="LocationFilterUpdatePanel" runat="server">
    <ContentTemplate>

        <asp:DropDownList ID="DDL1" OnSelectedIndexChanged="DDL1_SelectedIndexChanged" runat="server" AutoPostBack="true">

        </asp:DropDownList>


        <asp:DropDownList ID="DDL2"  OnSelectedIndexChanged="DDL2_SelectedIndexChanged" runat="server" AutoPostBack="true">

        </asp:DropDownList>

    </ContentTemplate>
    </asp:UpdatePanel>

And the Code Behind:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!System.Web.UI.ScriptManager.GetCurrent(Page).IsInAsyncPostBack)
        {
            var context = new SitecoreContext();
            //Get Model from Sitecore

            DDL1.DataSource = Model.Data;
            DDL1.DataValueField = "Id";
            DDL1.DataTextField = "Name";
            DDL1.DataBind();
        }

    }

    protected void DDL1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var context = new SitecoreContext();
        //Get Model from Sitecore

        DDL2.DataSource = Model.Data;
        DDL2.DataValueField = "Id";
        DDL2.DataTextField = "Name";
        DDL2.DataBind();
    }

    protected void DDL2_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

The page loads fine, but (when debugging) changing the DDL1's index it will show a Null exception in MyItem.Text. This is outside the control panel. Note: I have also added a script manager.

There are plenty of things I've tried. Setting different update modes, updated the AjaxToolkit in my solution by executing Install-Package AjaxControlToolkit from the Package Manager Console... but the behaviour remains the same.

Thank you.

Upvotes: 4

Views: 1712

Answers (2)

Ruud van Falier
Ruud van Falier

Reputation: 8877

Put the databinding for DDL1 to the OnInit, rather than the Page_Load.
And don't include the if statement in there, just do the databind.
After the OnInit the selected values will be correctly set and you will be able to access the DDL1's options in the other event handlers.

Upvotes: 5

user459491
user459491

Reputation:

You have asp:DropDownList control with an AutoPostBack set to true.

Remove the AutoPostBack=true from the Dropdownlist control and set an Async trigger for your UpdatePanel, set to the Dropdownlist and its eventname="SelectedIndexChanged"

This is a know issue, and you find a lot of documentation about it.

Upvotes: 0

Related Questions