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

3
我正在尝试创建自己的网站管理框架,类似于DNN / SiteFinity(仅为大幅简化版本)。
其中一个重要但常见的功能是能够动态添加用户控件以提供额外的功能。
我更喜欢使用预编译的.NET“Web应用程序”而不是动态编译的“网站”。
对于使用LoadControl方法在预编译的Web应用程序中动态添加用户控件的影响,特别关注以下几点:
1. 会话(假设我正在使用状态服务器) 2. 所有其他用户会发生什么情况 - 他们会被注销吗? 3. 应用程序池由于某些编译更改而进行重新启动?
我不确定是否曾经在预编译的Web应用程序中动态添加过用户控件,因为我主要使用的是“网站”,所以我做出了一个大胆的假设,即它将起作用,因为如果网站已经预编译,则这是否意味着动态添加的用户控件将根据需要动态编译,即使该站点已经预编译?
编辑
我还忘记提到用户控件将位于应用程序目录之外,因此不会在Web部署期间发布 - 它们将通过另一个网站上传。
谢谢! 丹。

我建议你研究一下 ASP.Net 内置的 Portal Framework。它允许你创建模块化的网站,这类似于你所尝试做的事情。看看它是否符合你的需求是值得的,这样你就不必重复造轮子了。它还允许个性化,以便不同的用户可以拥有定制的网站视图。 - Waleed Al-Balooshi
您的反馈并没有真正回答问题。我实际上已经使用jQuery构建了与微软门户相同的功能,具有完整的漂亮拖放和动态加载HTML编辑器。 - Dan B
2个回答

1

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

我来介绍一下用户控件的生命周期:

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

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

建议:

  1. ID属性中始终为UserControl分配唯一的ID。

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

  3. 因此,在Post_Back上,我建议调用LoadControl以获取原始的UserControl。然后在加载第二个之前,将第一个的Visible属性设置为false以将其删除。

我需要在将用户控件添加到预编译站点之前对它们进行预编译吗?这些用户控件将位于Web应用程序目录之外。 - Dan B

0

超级文章 - 但我认为它们没有解决将用户控件动态加载到预编译的 Web 应用程序的问题。 - Dan B
我应该提到过去我已经动态加载了用户控件到一个“网站”中,所以我对如何做到这一点感到很自在。我更关心的是如何在特定类型的部署中正确地完成它。 - Dan B
如果您创建了一个 Web 应用程序,并且有一个页面和一个用户控件。在您的页面中,您加载该用户控件。该用户控件已经编译为应用程序的一部分。如果您有两个应用程序。应用程序 1 有一个页面,应用程序 2 有一个用户控件。如果页面加载用户控件,则需要从应用程序 2 中获取程序集,以便具有编译后的代码。 - Phill
我只是试图做DNN和Sitefinity标准提供的功能,只是更简单。目前,我正在研究预编译用户控件或创建虚拟路径提供程序以从数据库中提供用户控件(但我认为这需要完全信任,这让我感到不安)。 - Dan B
如果有帮助的话,DNN不是动态编译的,它将程序集加载到应用程序域中。 - Phill
显示剩余7条评论

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