Каков правильный способ установки нескольких элементов управления внутри панели обновления?
У меня есть одна регистрационная форма, которая содержит от 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>