Каков правильный способ установки нескольких элементов управления внутри панели обновления?

У меня есть одна регистрационная форма, которая содержит от 3 до 4 элементов управления выпадающим списком и 2 datepickers, и теперь, когда выбраны значения управления выпадающим списком (выбрано изменение indindex) то я не хочу, чтобы моя страница была обратной.

У меня есть панель обновления, чтобы остановить это поведение сообщения, как показано ниже:

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

      <%--Update Panel for date picker%>
      <asp:UpdatePanel ID="UpdatePanelDatepicker" runat="server">
                    <ContentTemplate>
                      <telerik:RadDatePicker ID="rdpDate1" runat="server">
                      </telerik:RadDatePicker>
                    </ContentTemplate>
      </asp:UpdatePanel>

       <%--Update Panel for Dropdown--%>
       <asp:UpdatePanel ID="updatepaneldata" runat="server"> 
                      <ContentTemplate>
                     <telerik:RadComboBox ID="ddlCountry" runat="server">
                      </telerik:RadComboBox>
                    </ContentTemplate>
      </asp:UpdatePanel>


  </ContentTemplate>
    </asp:UpdatePanel>

Итак, я просто хотел спросить, что это правильный способ поместить несколько элементов управления в панели обновления?

Ответы

Ответ 1

Подпишитесь на событие ajax initializeRequest на стороне клиента. В этом случае мы можем отменить обратную передачу ajax, если нам нужно.

Метод initializeRequest возникает до начала обработки асинхронного запроса. Вы можете использовать это событие для отмены обратной передачи.

В этом случае мы проверим, будет ли инициирована асинхронная обратная передача из-за ddlCountry, и если да, то мы отменим пост ajax, так что пост-ответ не произойдет.

Чтобы решить вашу проблему, просто выполните следующие действия. Добавьте следующий JavaScript на страницу aspx. В приведенном ниже коде метод pageLoad автоматически вызывается ASP.Net Framework на стороне клиента, когда браузер загружает страницу и после загрузки всех сценариев, а также всех созданных клиентских объектов.

JavaScript, чтобы отменить ответ со списком сообщений

<script type="text/javascript">
function pageLoad()
{
     Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(CancelComboBoxPostback);
}

function CancelComboBoxPostback(sender, args)
{
  var prm = Sys.WebForms.PageRequestManager.getInstance();
  if (prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'ddlCountry') {
         args.set_cancel(true);
    }
 }
</script>

Ниже приведена рекомендация, а не часть решения вашей конкретной проблемы.. Кроме того, я бы рекомендовал держаться подальше от nested update panels, поскольку это может привести к неожиданным результатам, если разработчик не зная, как работают вложенные панели обновлений. В вашей ситуации единая панель обновления должна быть достаточной, как в разметке ниже, а не вложенных панелях обновлений, которые вы использовали в исходной разметке.

Разметка без вложенных панелей обновлений

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
              <telerik:RadDatePicker ID="rdpDate1" runat="server">
              </telerik:RadDatePicker>

              <telerik:RadComboBox ID="ddlCountry" runat="server">
              </telerik:RadComboBox>
    </ContentTemplate>
</asp:UpdatePanel>

Ответ 2

Честно говоря, UpdatePanel я нахожу больше проблем, чем того стоит.

Элементы управления

UpdatePanel являются центральной частью функциональности Ajax в ASP.NET. Они используются с элементом управления ScriptManager для включения частичное отображение страниц. Частичное отображение страниц уменьшает необходимость синхронные обратные вызовы и полные обновления страниц, когда только часть страница должна быть обновлена. Улучшение изображения на частичной странице потому что он уменьшает мерцание экрана, которое происходит во время полнотекстовый обратный вызов и улучшает интерактивность веб-страниц.

Я часто нахожу, что реализация элементов управления вызывает больше проблем, чем это стоит. Поэтому я часто реализую свои собственные службы Ajax для обработки такой логики. Вы можете сделать это в старой школе, довольно легко.

// Create .aspx page, to be our service. 
public class ControlUpdateService
{
     protected void Page_Load(object sender, EventArgs e)
     {
          // Use an approach to determine which control type, and model to build.         
          // You would build your object, then use Newtonsoft.Json, to serialize, then
          // return the object, via Response.End(object). 
     }
}

Затем ваша страница будет Ajax данных, ударит службу, а затем создаст ваш контроль через .success в вызове Ajax. Если вы сделаете такой подход, вы обязуетесь сохранять свои данные через Ajax. Запомни. Поскольку я отвечал на этот вопрос, я не могу не чувствовать, что ваша проблема связана с управлением, выполняющим AutoPostback. Что вы действительно можете отключить.

AutoPostBack = "false";

Telerik может отличаться, но в документации должно быть четко указано, как отключить эту функцию. Который мог бы объединить вашу потребность в UpdatePanel все вместе. Позволяет сохранять ваши данные на PostBack правильно.

Ответ 3

Использовать telerik Ajaxloadingpanel, кроме UpdatePanel, это полезно для вашего кода. Попробуйте этот пример.

    <telerik:RadAjaxLoadingPanel ID="rlp" runat="server" Skin="Metro">
</telerik:RadAjaxLoadingPanel>

    <telerik:RadAjaxPanel runat="server" LoadingPanelID="rlp" skin="Metro">
        <telerik:RadDatePicker ID="rdpDate1" runat="server">
          </telerik:RadDatePicker>

          <telerik:RadComboBox ID="ddlCountry" runat="server">
          </telerik:RadComboBox>
</telerik:RadAjaxPanel>