C# “处理多个问题”;“链锁”;在单个页面中从动态创建的控件回发

C# “处理多个问题”;“链锁”;在单个页面中从动态创建的控件回发,c#,asp.net,webforms,event-handling,postback,C#,Asp.net,Webforms,Event Handling,Postback,我正试图为一个项目构建一个非常特定的搜索页面,但在处理由单个页面上动态生成的控件调用的多个回发时遇到了很多麻烦 页面的工作方式必须如下所示: 只有一个复选框,“详细搜索”,在选中/取消选中时会导致回发 当详细搜索未激活时,将显示包含内容和按钮的简单网格。没什么特别的 当详细搜索处于活动状态时,必须从一些动态数据生成N复选框,这些数据表示希望进行搜索的部分。在复选框下面,将出现一个支持AJAX的选项卡控件,最初没有选项卡页面 选中其中一个节复选框时,将发生回发。回发后,将在用户选择的分区中搜

我正试图为一个项目构建一个非常特定的搜索页面,但在处理由单个页面上动态生成的控件调用的多个回发时遇到了很多麻烦

页面的工作方式必须如下所示:

  • 只有一个复选框,“详细搜索”,在选中/取消选中时会导致回发

    • 当详细搜索未激活时,将显示包含内容和按钮的简单网格。没什么特别的

    • 当详细搜索处于活动状态时,必须从一些动态数据生成N复选框,这些数据表示希望进行搜索的部分。在复选框下面,将出现一个支持AJAX的选项卡控件,最初没有选项卡页面

      • 选中其中一个节复选框时,将发生回发。回发后,将在用户选择的分区中搜索数据,然后将一个新的选项卡页面添加到选项卡控件中,该页面包含一个网格视图和分区名称。如果未选中该复选框,则在回发后,选项卡页面将再次从控件中消失
现在的问题是,几乎所有东西都必须动态生成,而且几乎所有东西都与其他东西相连接

第一个问题:处理“详细搜索”复选框。听起来很容易,不是吗?我最初的想法是在选中/取消选中事件处理程序期间将
Page.Viewstate[“DetailedSearchEnabled”]
设置为
true
false
,然后在
Page\u Load
期间创建控件动态检查
DetailedSearchEnabled
的值

否。回发事件处理发生在
页面加载
页面加载完成
之间。需要额外刷新,事情才能正常工作


听起来你应该使用CheckBoxList控件来处理你的动态复选框。您可以在回发期间将remove items添加到复选框列表中,而不必担心在表单中动态添加/删除实际控件/事件

以下是msdn的链接:

以下是一些示例代码:

Protected void Button1_Click (object sender, System.EventArgs e)
{
    CheckBoxList.Items.Add(new ListItem("TextValue1", "Value1"));
    CheckBoxList.Items.Add(new ListItem("TextValue2", "Value2"));
}

如果所有其他方法都失败了,您仍然可以回到快速而肮脏的老式ASP方式

  • 使用
    Response.Write
    将动态控件生成为普通的旧HTML(简单表单字段,例如
  • 确保在回发后,您可能需要的每一条信息都有一个表单字段。如有必要,使用隐藏表单字段在后续回发中“重新发布”值
  • 回发后,使用
    请求
    对象检索控件的值
  • 使用这些值可以根据需要调整控件的生成
您应该能够在
Page\u Load
中完成所有这些操作。好处是完全自由。缺点是完全可以自由地将aspx弄得一团糟。因此,您可能希望将所有这些脏代码从您的aspx迁移到自定义控件中,然后将其添加到您的aspx中


生成自己的HTML时,请注意不要引入XSS漏洞。必要时使用HtmlEncode。

与其进行如此多的回发,不如使用jquery和ajax调用根据需要加载控件,然后将事件附加到控件上,或者甚至可以使用UpdatePanel。帮助链接:


正如你自己所建议的,有更好的方法来解决这个问题

如果我处于相同的情况,我将创建与页面交互的web方法,并使用客户端来完成UI。我目前主要使用angular JS,尽管它有一个学习曲线。您可以使用ng hide/ng show绑定到复选框事件以显示详细搜索。当需要显示n个复选框时,您可以使用ng repeat填充它们,对于需要显示的每个项目,选中/取消选中后,如果需要额外数据,您可以通过web方法调用动态填充新控件等

根据我的经验,纯ASP回发非常笨拙,不适合构建可维护的动态UI

第一个问题:处理“详细搜索”复选框

正确的方法(如果要使用页面回发)如下所示:

  • 在CheckChanged事件处理程序中,将选中属性的值保存到
    ViewState[“DetailedSearchEnabled”]
    。如果该值为true,请将动态复选框添加到页面。如果该值为false,请查找并删除它们
  • 覆盖LoadViewState。调用
    base.LoadViewState
    后,如果
    ViewState[“DetailedSearchEnabled”]
    为true,则重新创建动态复选框并关联其事件。请注意,Page_Load和Page_LoadComplete都不是执行此操作的合适位置
是的,您应该在页面生命周期的两个点上创建动态复选框。我推荐一种助手方法

通常,事件处理程序只应添加或删除受这些特定事件影响的动态控件(如果有),但LoadViewState应重新创建上一页请求中存在的所有动态控件。必须在视图状态中存储足够的信息,以便LoadViewState执行此操作


我对的回答演示了如何添加和删除动态控件。您可能希望将其用作参考。

这将有助于解决问题的一小部分。问题的关键不是找到一个现有的解决方案,而是理解如何解决多个回发相互依赖的类似问题。我不认为有任何情况下你应该将多个回发“链接”在一起。如果你想这么做,你