UpdatePanel перезагружает всю страницу

Я создаю элемент управления asp.net cutom, внутри которого у меня есть два раскрывающихся списка: companyIdSelection и productFamilySelection. Я заполняю companyIdSelection в Page_Load и для заполнения productFamilySelection в зависимости от выбранного элемента в companyIdSelection. Я использую UpdatePanels для достижения этой цели. , но по какой-то причине каждый раз, когда я обновляю companyIdSelection, вызывается Page_Load (что, насколько мне известно, должно происходить только при перезагрузке всей страницы), список снова перезагружается, и элемент, выбранный пользователем, теряется (выбранный элемент всегда наверху). Вот код

    <asp:UpdatePanel ID="updateFamilies" 
                     runat="server" 
                     UpdateMode="Always">           
        <ContentTemplate>
            Company ID:<br>
            <br></br>
            <asp:DropDownList ID="companyIdSelection" 
                              runat="server" 
                              AutoPostBack="True" 
                              OnSelectedIndexChanged="companyIdSelection_SelectedIndexChanged">
            </asp:DropDownList>
            <br></br>
            Product Family:
            <br></br>
            <asp:DropDownList ID="productFamilySelection" runat="server" 
                              AutoPostBack="True" 
                              onselectedindexchanged="productFamilySelection_SelectedIndexChanged">
            </asp:DropDownList>
            <br>
        </ContentTemplate>                 
    </asp:UpdatePanel>

protected void Page_Load(object sender, EventArgs e)
{
    this.companyIdSelection.DataSource = companyIds(); //companyIds returns the object containing the initial data items
    this.companyIdSelection.DataBind();
}

protected void companyIdSelection_SelectedIndexChanged(object sender, EventArgs e)
{
    // Page_Load is called again for some reason before this method is called, so it 
    // resets the companyIdSelection
    EngDbService s = new EngDbService();
    productFamilySelection.DataSource = s.getProductFamilies(companyIdSelection.Text);
    productFamilySelection.DataBind();
}

Also, I tried setting the UpdateMode of the UpdatePanel to "Conditional" and adding an asyncpostback trigger but the result was the same. What am I doing wrong?

PS: я исправил проблему обновления, используя Page.IsPostBack в методе Page_Load, но я все же хотел бы избежать полной обратной передачи, если это возможно


person Emil D    schedule 07.04.2010    source источник


Ответы (2)


Я думаю, вы неправильно понимаете, как работает UpdatePanels. На самом деле они делают полную обратную передачу страницы, просто на этапе рендеринга они захватывают только часть вывода и отправляют ее обратно в ответе AJAX, чтобы страницу можно было обновить. Дополнительная информация здесь.

Таким образом, вам все равно нужно будет проверить, является ли это обратной передачей в вашем событии page_load, и выполнить загрузку данных только в том случае, если это не так.

person patmortech    schedule 07.04.2010

Обратный вызов панели обновления будет проходить через загрузку страницы при каждом обратном вызове. Фактически, будет происходить жизненный цикл страницы извлечения (минус рендеринг и предварительный рендеринг). Панели обновлений выглядят как ajax, но ваш код на стороне клиента по-прежнему отправляется на ту же страницу, что и является проблемой, которую вы описываете. Если вы можете избежать использования панелей обновлений, я предлагаю вам это сделать. Вместо этого используйте что-то вроде jQuery. Если нет, то используйте это в своем Page_Load

if (Page.IsCallback) { } //Do callback specific code here
else { } //Do Postback specific code here

Надеюсь это поможет. Удачи.

person Audie    schedule 07.04.2010