在C#Web应用程序而不是网站中动态加载用户控件

时间:2010-12-27 22:13:15

标签: c# asp.net user-controls dynamic loadcontrol

我正在尝试创建类似于DNN / SiteFinity的自己的网站管理框架(只有很多版本)。

一个重要的(但很常见的)功能是能够动态添加用户控件以提供其他功能。

我更喜欢在动态编译的“网站”上使用预编译的.NET“Web应用程序”。

使用LoadControl方法为预编译的Web应用程序动态添加用户控件有什么含义,具体如下:

  1. 会话(假设我使用的是状态服务器)
  2. 所有其他用户会发生什么 - 他们会被退出吗?
  3. 由于某些编译的更改导致应用程序池回收?
  4. 我不确定我是否曾经动态地将用户控件添加到预编译的Web应用程序中,因为我主要使用“网站”,所以我做出了一个很大的假设,它会起作用,因为如果网站是预编译的,这是否意味着动态添加的用户控件将根据需要动态编译,即使该站点是预编译的?

    修改

    我也忘了提到用户控件将在应用程序目录之外,因此在Web部署期间不会发布 - 它们将通过其他网站上传。

    谢谢! 丹。

2 个答案:

答案 0 :(得分:1)

您可以在预编译的网站中动态添加用户控件。

我给出了关于用户控制生命周期的描述:

页面上的每个控件都有一个名为ClientID的唯一ID。 (这是每个控件的实际属性。)用户控件是“命名容器”。这意味着它包含的每个控件也包含User控件的ID。例如,UserContro l中具有ID“UserControl1”的“TextBox1”将具有clientID: UserControl1_TextBox1

回发ClientID从每个字段中检索值。例如,要从表单中获取上述TextBox's值,请使用Request.Forms["UserControl1_TextBox1"]。 现在,当您将一个UserControl替换为具有相同ClientID的另一个时,会发生什么?第二个获取第一个数据。

建议:

  1. 始终为其UserControl媒体资源中的ID分配唯一ID。

  2. 您应该始终重新创建发送到的页面的控件 浏览器postback上的浏览器,然后重新排列它们。这允许 原始控件加载其数据并运行其事件处理程序。 它还允许ViewState正确分发其内容 没有收到ViewState损坏的错误。

  3. 所以在Post_Back上,我建议调用LoadControl来获取原始版本 UserControl。然后在加载第二个之前,设置第一个可见 将属性设置为false以将其删除。

答案 1 :(得分:0)

  1. 会话无问题
  2. 没有
  3. 没有
  4. 我唯一的建议是你读到:

    http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx

    http://weblogs.asp.net/infinitiesloop/archive/2006/08/30/TRULY-Understanding-Dynamic-Controls-_2800_Part-2_2900_.aspx

    http://weblogs.asp.net/infinitiesloop/archive/2006/08/30/TRULY-Understanding-Dynamic-Controls-_2800_Part-3_2900_.aspx

    http://weblogs.asp.net/infinitiesloop/archive/2006/10/16/TRULY-Understanding-Dynamic-Controls-_2800_Part-4_2900_.aspx

    您目前使用“网站”而不是网络应用程序这一事实并未改变您动态添加控件的能力。如果MS只是完全删除了“网站”,那将是非常有益的,因为它只会产生问题。那是另一天的另一个论点。