【问题标题】:Dynamically loading user controls in C# Web Application rather than website在 C# Web 应用程序而不是网站中动态加载用户控件
【发布时间】:2011-05-31 08:13:02
【问题描述】:

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

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

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

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

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

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

编辑

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

谢谢! 丹。

【问题讨论】:

  • 我建议您查看 ASP.Net 中内置的 Portal Framework。它允许您创建模块化网站,这有点类似于您正在尝试做的事情。可能值得一看,看看它是否符合您的需求,这样您就不必重新发明轮子。它还允许个性化,以便不同的用户可以有自定义的网站视图。
  • 您的反馈并未真正解决问题。实际上,我已经在 jquery 中构建了 MS 对他们的门户所做的操作,通过动态加载 HTML 编辑器进行完全精美的拖放操作。

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


【解决方案1】:

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

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

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

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

建议:

  1. 始终在 UserControlID 属性中为其分配唯一 ID。

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

  3. 所以在 Post_Back 上,我建议拨打LoadControl 获取原件 UserControl。然后在加载第二个之前,设置第一个的可见 属性为 false 以将其删除。

【讨论】:

  • 我是否需要在将用户控件添加到预编译站点之前对其进行预编译 - 用户控件将位于 Web 应用程序目录之外。
【解决方案2】:
  1. 会话没有问题
  2. 没有
  3. 没有

我唯一的建议是你阅读:

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 完全删除“网站”,那将是相当有益的,因为它只会产生问题。那是另一天的不同论点。

【讨论】:

  • 超级文章 - 但我不认为它们解决了将用户控件动态加载到预编译的 Web 应用程序中的问题。
  • 我应该提到我过去已经将用户控件动态加载到“网站”中,所以我对如何做到这一点感到满意。我更关心如何在特定类型的部署中正确地做到这一点。
  • 它们可以帮助您了解控件的加载方式。如果你有一个用户控件,就像一个计算器,并且你动态地加载它,事件就不会只是神奇地在这些控件上引发。如果您阅读了这些文章,您就会明白为什么以及如何理解,而无需回到 Stack Overflow 上,当您遇到动态加载控件的所有问题时,您需要问的 30 个问题。
  • 您可以在 Web 应用程序中执行您过去一直在执行的操作。
  • 我过去只使用网站而不是 Web 应用程序,但现在我正在切换到 Web 应用程序并在跳之前思考这就是为什么我首先检查这些决定的影响。
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多