我有一个 UserControl
可以动态创建多个 TextBox。文本框的数量取决于用户的选择。我选择将每个 TextBox
的 ID 存储在 UserControl
的 ViewState
对象中,以便它们可以在每次回传中一致地重新创建。
如果我在 Page_Init
期间重新创建动态控件(如推荐的那样),则 UserControls
的 ViewState
尚未填充.
如果我在 Page_Load
或 PreLoad
期间重新创建动态控件,那么它们的回传值直到 Page_Load
事件之后才会重新水化,所以直到导致问题的页面生命周期后期,我才能访问它们的正确值。
有更好的方法吗?
最佳答案
我遇到了类似的第 22 条军规——我需要向我的页面添加动态用户控件,但它们取决于用户所做的下拉列表选择。当然,在设置 View 状态之前,下拉列表的值无法访问,但是如果我们希望用户控件通过 View 状态维护它们自己的状态,建议在 Page_Init 中创建用户控件,但那是在 View 状态存在之前,所以我无法轮询那里的下拉列表。
另一个对我有用的建议——从 Request.Form 集合中获取下拉列表的值:
protected void Page_Init(object sender, EventArgs e)
{
//get the user's DropDownList selection
int visualizerMode = Int32.Parse(Request.Form[ddlVisualizerMode.UniqueID]);
//now dynamically load a usercontrol based on that value
LoadUserControl(visualizerMode);
}
...这对我来说效果很好。这是直接使用 HTML 表单的倒退,我经常忘记这一点,因为它已经在 ASP.NET WebForms 模型中使用了很多年。
关于c# - ASP.NET 基于 ViewState 动态加载控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18739335/