我更喜欢JavaScript/AJAX的解决方案,但是
我认为你的代码没有问题。
我做了一个小例子。这里有与您相同的解决方案。优点是只有在单击时才加载控件。
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnLink_Click(object sender, EventArgs e)
{
var uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx");
pnl.Controls.Add(uc);
}
}
以下是一个例子,在Page_Load事件中加载用户控件,当点击(btnLink_Click)时,将用户控件添加到面板中。它与您的解决方案相同,但即使不需要,用户控件也可以被加载(在内存中处理而不是呈现)。
public partial class Default : System.Web.UI.Page
{
UserControl uc;
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx");
}
protected void btnLink_Click(object sender, EventArgs e)
{
pnl.Controls.Add(uc);
}
}
这里有一个我喜欢的解决方案,它基于可见属性。如果用户控件不可见,则不会呈现到输出中。当然,在表格具有许多单元格的情况下,将控件容器替换为面板并不是很实用。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Register Src="~/WebUserControl1.ascx" TagName="ucrCtrl" TagPrefix="ctr" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnLink" runat="server" Text="Add" OnClick="btnLink_Click" />
<asp:Panel runat="server" ID="pnl">
<ctr:ucrCtrl runat="server" ID="usrCtrl" Visible="false" />
</asp:Panel>
</div>
</form>
</body>
</html>
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnLink_Click(object sender, EventArgs e)
{
usrCtrl.Visible = true;
}
}
}