C# 无法在OnInit事件中获取值

C# 无法在OnInit事件中获取值,c#,asp.net,dynamic,wizard,C#,Asp.net,Dynamic,Wizard,我理解事件在页面生命周期中发生的顺序,但这对我的情况没有帮助。我有一个复选框列表,由一个充满表单的目录填充。当我选中表单名称旁边的复选框时,我希望它动态创建向导步骤并插入表单 事件顺序: OnInit: GatherForms()-检查目录并将所有表单名称加载到复选框中 LoadForms()-检查“选定”会话并加载已收集的表单 复选框列表:SelectedIndexChanged#AutoPost=true# PopulateForms()-循环检查复选框并将其添加到会话状态 当用户单击复选框

我理解事件在页面生命周期中发生的顺序,但这对我的情况没有帮助。我有一个复选框列表,由一个充满表单的目录填充。当我选中表单名称旁边的复选框时,我希望它动态创建向导步骤并插入表单

事件顺序: OnInit: GatherForms()-检查目录并将所有表单名称加载到复选框中 LoadForms()-检查“选定”会话并加载已收集的表单

复选框列表:SelectedIndexChanged#AutoPost=true# PopulateForms()-循环检查复选框并将其添加到会话状态

当用户单击复选框时,它会进行回发并点击从会话中提取的OnInit。问题是PopulateForms()尚未运行,因此即使已选中,也未填充任何内容。如果我单击另一个项目,它将回发并显示。在刷新之前,我似乎无法从复选框中提取任何有用的信息,这意味着我无法看到表单立即出现。我也尝试过循环复选框,但不幸的是viewstate尚未发布。唉

有什么建议吗

谢谢


注意:我不能使用Request.Form[],因为我必须从复选框中取出所有选中的项目。也许我可以,但我找不到一个方法:/

动态控件的经典陷阱

老实说,最好的解决方案就是使用
Request
values数组来查找您需要的信息,而忽略这种特殊情况下的生命周期内容

OnInit()
中,发布的值就在那里,只是ViewState还没有处理它们。因此,您可以使用
if(Request[“myCheckBoxName”]==xxx)
处理单个复选框,或者使用
Request[“\uu EVENTTARGET”]
获取导致回发的控件的名称


请参阅我的旧答案,以更深入地讨论该问题。

仅在OnInit中添加动态控件。在页面加载之前不要进行任何填充/处理。通过这种方式,您将保留您的价值观。

这是我在ASP.NET上取得进步时遇到的一个常见问题

使用动态控件,您会遇到在OnInit期间它们实际上不存在的问题

您可以做的是创建用户在OnInit期间可能看到的所有控件,并隐藏用户在代码中看不到的元素。页面将被加载,所有可能的控件将被实例化(在代码中-不要担心这会出现在HTML中并使其膨胀),然后事件处理程序将启动,然后您可以处理向导可见性的设置

例如:

public void OnInit(object sender, EventArgs e)
{
    GatherForms();
    CreateWizardForm(); // creates a wizard and adds controls it will need
}

private void Checkbox_Checked(object sender, EventArgs e)
{
    var checkBox = (CheckBox)sender;
    // append checkBox.SelectedValue to session state object of checkboxes
}

protected override void OnPreRender(object sender, EventArgs e)
{
    if (/* Session checkboxes contain values */)
    {
        this.WizardForm.Visible = true;
        this.CheckboxList.Visible = false;
    }
}

如果您提前知道哪些控件将出现在向导窗体中,则此功能将起作用。您可以在OnPreRender事件中更改这些控件的值,切换它们的可见性,等等,但您不能去添加新控件(例如controls.add(new Button())——这必须在OnInit事件中完成。

是的,这是一场噩梦。第一次使用动态控件,我已经决定不喜欢它们了!我已经试着让这个简单的表单加载器工作了一个半星期了,我感觉自己比现在更无聊。谢谢你的帖子,我会看看我是否能想出这个请求。如何循环检查复选框列表以查看请求中已检查的内容?您基本上需要检查每个复选框值以查看是否已发布。复选框应该有某种命名方案-如果您查看调试器中的请求值,应该可以清楚地了解如何解析已选中的名称。好的,现在我使用EVENTTARGET使其工作,它允许我编写两个不同的加载事件,这正是我所需要的。现在我的问题是,当我单击复选框并删除它时,它会出错。给我一个viewstate错误。今天我将继续写这篇文章,但在我花一整天的时间写之前,也许你们会看到一些错误。谢谢你的帮助。Doh,我会发布新的帖子来展示代码。谢谢你的评论,即使你加载了100个表单,这是最聪明的方式吗?这会是一个巨大的表演冲击吗?我不知道最终会添加多少表单,因为它们可以将它们放到文件夹中。所有这些对我来说都是新的,听起来可能更容易实现。另外,如何在这些论坛中粘贴代码?谢谢你的想法和你的想法结合起来,使这变得容易多了。谢谢。100张表格可能是也可能不是什么大问题——这取决于你的情况。显然,任何时候都可以重用控件(只需更改它们的标签、值和列表项)是理想的,但也可能会遇到无法满足新需求的表单模板。如果你的表单很简单,并且不需要复杂的计算或往返数据库,那么这可能不是什么大问题,除非你正在处理该页面的大量流量。谢谢,我的项目现在确实在飞速发展。使加载控件等更容易,并确保所有内容保持同步。幸运的是,这个项目没有涉及数据库,所以我很幸运,只是一群人创建表单,将表单输入到应用程序中进行访问。再次感谢!很高兴听到!不要忘记记住可伸缩性。如果你说的是在机器上填充页面的时间不到一秒,那就太好了。如果您的生产环境每秒有几十个请求,这可能会成为瓶颈。