AFAIK, программно работает добавление асинхронных триггеров к элементу управления UpdatePanel
.
Обходной путь - добавить их в событие Page_Init
и установить для свойства ControlID
триггера значение уникального идентификатора элемента управления:
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
// unique id instead of client id
trigger.ControlID = yourDropDownControl.UniqueID;
trigger.EventName = "SelectedIndexChanged";
QuoteUpdatePanel.Triggers.Add(trigger);
Кажется, сделал эту работу. Я создал похожую структуру страницы / управления выше. Таким образом, есть пользовательский элемент управления QuotePropertyControl
и Default
страница, которая содержит этот элемент управления.
Я добавил свойство dropDownList.AutoPostBack = true
и смог отловить асинхронную обратную передачу из выпадающего списка. Итак, угадывание проблемы было в этом свойстве.
Еще одна вещь: действительно не имеет значения, как зарегистрировать асинхронный триггер; оба варианта ScriptManager.RegisterAsyncPostBackControl
и AsyncPostBackTrigger
работали как шарм (до события init страницы).
Вот как я это сделал:
QuotePropertyControl.ascx.cs
private string[] data = { "a", "b", "c", "d", "e" };
public void PopluateUpdatePanel(IEnumerable<string> standardOptions)
{
foreach (string standardOp in standardOptions)
{
DropDownList dropDownList = new DropDownList();
dropDownList.SelectedIndexChanged +=
QuotePropertyDropDown_SelectedIndexChanged;
dropDownList.ID = standardOp + "DropDownList";
dropDownList.CssClass = "quote-property-dropdownlist";
dropDownList.AutoPostBack = true;
dropDownList.DataSource = data;
dropDownList.DataBind();
Label propertyLabel = new Label() { Text = standardOp };
StandardOptionsPlaceHolder.Controls.Add(propertyLabel);
StandardOptionsPlaceHolder.Controls.Add(dropDownList);
ScriptManager.GetCurrent(Page)
.RegisterAsyncPostBackControl(dropDownList);
}
}
protected void QuotePropertyDropDown_SelectedIndexChanged(
object sender,
EventArgs e
)
{
StandardOptionsUpdatePanel.Update();
}
QuotePropertyControl.ascx
<asp:UpdatePanel ID="QuoteUpdatePanel" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
Cost:
<asp:Label ID="QuoteCostLabel" runat="server" />
<fieldset id="standard-options">
<legend>Standard Options</legend>
<asp:UpdatePanel ID="StandardOptionsUpdatePanel"
runat="server"
ChildrenAsTriggers="true"
UpdateMode="Conditional">
<ContentTemplate>
<asp:PlaceHolder ID="StandardOptionsPlaceHolder"
runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
Default.aspx.cs
string[] names = { "ab", "bc", "ef" };
protected void Page_Init(object sender, EventArgs e)
{
ctlQuoteProperty.PopluateUpdatePanel(names);
}
Default.aspx
<%@ Register Src="~/QuotePropertyControl.ascx"
TagPrefix="uc"
TagName="QuoteProperty" %>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager" runat="server" />
<uc:QuoteProperty runat="server"
ID="ctlQuoteProperty">
</uc:QuoteProperty>
</div>
</form>