Динамический Control в UpdatePanel
UpdatePanel лучше не применять, точнее пользы от него особой нет… трафик между клиентом и сервером меньше, но все-таки много трафика идет в запросе к серверу, так как передается ViewState и прочее.
Но зато как просто и удобно создать с ним приложения! Что я сейчас и делаю, мне надо сделать некий прототип приложения и UpdatePanel идеально для этого подходит.
Одна из первых проблем это создание динамических UserControl и добавление их в UpdatePanel. Я приведу небольшой код который может пригодится тем кто столкнется с такойже задачей. По сути это ничем не отличается от обычного поведения страницы, без всякого AJAX.
Задача состоит в том чтобы через LoadControl добавлять в UpdatePanel свои элементы и потом с ними работать, но так как они динамические, то для их работы требуются дополнительные действия. Здесь я привожу код который у меня работает, все очень просто, текущий контрол сохраняется в ViewState.
Страница
Default.aspx
<form id="form1" runat="server">
<ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel runat="server" ID="UPContent">
<ContentTemplate>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:UpdatePanel runat="server" ID="UPTwo" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (ScriptManager1.IsInAsyncPostBack)
{
LoadControl();
}
}
public string CurrentControl
{
get
{
return ViewState["CurrentControl"] == null ? "WebUserControl2.ascx" : (string)ViewState["CurrentControl"];
}
set
{
ViewState["CurrentControl"] = value;
}
}
void LoadControl()
{
Control ctl = LoadControl(CurrentControl);
ctl.ID = "UserControl1";
UPContent.ContentTemplateContainer.Controls.Clear();
UPContent.ContentTemplateContainer.Controls.Add(ctl);
}
protected void Button1_Click(object sender, EventArgs e)
{
CurrentControl = "WebUserControl.ascx";
LoadControl();
}
Контролы
WebUserControl.aspx
<asp:UpdatePanel ID="UpdatePanelUserControl1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</ContentTemplate>
</asp:UpdatePanel>
WebUserControl.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = TextBox1.Text + DateTime.Now;
}
WebUserControl2.ascx пустой контрол нужен только для понимания работы.
14 июня 2007 г. 16:44