如何在ASP.NET中动态添加用户控件?

5

如何在ASP.NET中动态地在页面加载时添加用户控件?

我有一个带有ID="contentData"和一些控件的

  • one.ascx
  • two.ascx
  • three.ascx

现在我已经创建了一个名为default.aspx的页面,它可能以以下一种方式之一获取查询字符串参数:

default.aspx?val=one  
default.aspx?val=two  
default.aspx?val=three

我将从中取得数值。
Request.QueryString["val"]

现在我该如何在这个页面中加载特定的控件?
<div ID="controlData"></div>
4个回答

16

在你的aspx文件中

<div id="div1" runat="server">

</div>
在Page_Load中。
    UserControl uc = (UserControl)Page.LoadControl("test.ascx");
    div1.Controls.Add(uc);

您需要做的就是使您的 div 具有服务端属性,方法是添加 runat="server",在后台代码中使用 Page.LoadControl 去获取您的用户控件,然后使用 div 的 Controls.Add 将其添加到您的 div 中。


3
也许将那个div替换为Panel会更容易地映射到服务器上的实例(在某些情况下,当在html元素中添加runat=server时,VS不会自动生成成员)。根据来自查询的值构建ascx路径。验证或用try-catch包装;处理不存在的情况。为了实现通用的控件放置,通过以“”字符开头来构建路径(例如,“/controls/”+ this.Request.QueryString["val"] +“.ascx”) - 但是,请再次验证查询的值。 - user191966
我赞同对查询结果的值进行验证。 - Jason Dam
阅读了这些答案和一些文章后,我现在能够做得更好了。Page_Init()是我需要应用代码的函数,但我是否需要在!Page.IsPostBack中编写代码?如果是的话,为什么要使用这个函数呢? - Ahmed

3

1

1
...或者使用 ASP.NET Panel,它本质上与具有 runat=server 的 div 相同。 - Tim Schmelter

0

我有点不清楚你的问题,如果这个回答不是你想要的,请原谅。

假设可能的值在预先知道,并且数量不多——就像你的例子中的三个一样——最简单的方法是将所有控件都包含在“visible=false”的表单中,然后在Load方法中设置所需控件的visible属性为true。

如果可能的值非常多,或者它是动态的,以至于你在编码时甚至不知道可能性是什么,那么你可以放置一个包装对象,比如一个div,并将项目添加到其“controls”属性中。但是我会尽量避免这样做,因为它很难维护:未来的程序员甚至不知道屏幕上可能有哪些控件。


没有数据是动态的,都将从数据库加载,所以我无法承担加载并隐藏的开销... - Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接