3

我正在尝试创建自己的类似于 DNN/SiteFinity 的网站管理框架(只有一个非常精简的版本)。

一大(但常见的)功能是能够动态添加用户控件以提供附加功能。

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

使用 LoadControl 方法为预编译的 Web 应用程序动态添加用户控件的含义是什么:

  1. 会话(假设我正在使用状态服务器)
  2. 所有其他用户会发生什么 - 他们会被注销吗?
  3. 由于某些编译的更改而导致应用程序池回收?

我不确定我是否曾经将用户控件动态添加到预编译的 Web 应用程序中,因为我主要使用“网站”,所以我非常假设它会起作用,因为如果网站是预编译的,这样做意思是即使网站是预编译的,动态添加的用户控件也会根据需要动态编译?

编辑

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

谢谢!担。

4

2 回答 2

1

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

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

页面上的每个控件都有一个唯一的 ID,称为ClientID. (这是每个控件的实际属性。)用户控件是“命名容器”。这意味着它包含的每个控件还包含用户控件的 ID。例如,UserControID 为“UserControl1”的 l 中的“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. 然后在加载第二个之前,将第一个的 Visible 属性设置为 false 以将其删除。
于 2010-12-28T07:33:03.293 回答
0
  1. 会话没有问题

我唯一的建议是你阅读:

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

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

于 2010-12-27T22:34:06.637 回答