我正在尝试创建类似于DNN / SiteFinity的自己的网站管理框架(只有很多版本)。
一个重要的(但很常见的)功能是能够动态添加用户控件以提供其他功能。
我更喜欢在动态编译的“网站”上使用预编译的.NET“Web应用程序”。
使用LoadControl方法为预编译的Web应用程序动态添加用户控件有什么含义,具体如下:
我不确定我是否曾经动态地将用户控件添加到预编译的Web应用程序中,因为我主要使用“网站”,所以我做出了一个很大的假设,它会起作用,因为如果网站是预编译的,这是否意味着动态添加的用户控件将根据需要动态编译,即使该站点是预编译的?
修改
我也忘了提到用户控件将在应用程序目录之外,因此在Web部署期间不会发布 - 它们将通过其他网站上传。
谢谢! 丹。
答案 0 :(得分:1)
您可以在预编译的网站中动态添加用户控件。
我给出了关于用户控制生命周期的描述:
页面上的每个控件都有一个名为ClientID
的唯一ID。 (这是每个控件的实际属性。)用户控件是“命名容器”。这意味着它包含的每个控件也包含User控件的ID。例如,UserContro
l中具有ID“UserControl1”的“TextBox1”将具有clientID:
UserControl1_TextBox1
。
回发ClientID
从每个字段中检索值。例如,要从表单中获取上述TextBox's
值,请使用Request.Forms["UserControl1_TextBox1"]
。
现在,当您将一个UserControl
替换为具有相同ClientID
的另一个时,会发生什么?第二个获取第一个数据。
建议:
始终为其UserControl
媒体资源中的ID
分配唯一ID。
您应该始终重新创建发送到的页面的控件
浏览器postback
上的浏览器,然后重新排列它们。这允许
原始控件加载其数据并运行其事件处理程序。
它还允许ViewState
正确分发其内容
没有收到ViewState
损坏的错误。
LoadControl
来获取原始版本
UserControl
。然后在加载第二个之前,设置第一个可见
将属性设置为false以将其删除。答案 1 :(得分:0)
我唯一的建议是你读到:
您目前使用“网站”而不是网络应用程序这一事实并未改变您动态添加控件的能力。如果MS只是完全删除了“网站”,那将是非常有益的,因为它只会产生问题。那是另一天的另一个论点。