Asp.net 通过内容页上的下拉列表更改动态控件

Asp.net 通过内容页上的下拉列表更改动态控件,asp.net,dynamic,drop-down-menu,updatepanel,placeholder,Asp.net,Dynamic,Drop Down Menu,Updatepanel,Placeholder,问题:带有向导控件的内容页,带有UpdatePanel和占位符。UpdatePanel上方是DropDownList。当用户更改下拉列表中的选择时,我需要在下拉列表下方显示不同的输入控件。当用户单击向导控件上的“下一步”时,我还需要能够从这些动态控件中获取数据 我知道所有的动态控件都必须在OnInit方法中创建,以便在回发期间从这些控件获取数据。但是,当触发下拉列表的SelectedIndexChanged事件时,将调用OnInit方法。。。然后页面加载。。。最后调用SelectedIndexC

问题:带有向导控件的内容页,带有UpdatePanel和占位符。UpdatePanel上方是DropDownList。当用户更改下拉列表中的选择时,我需要在下拉列表下方显示不同的输入控件。当用户单击向导控件上的“下一步”时,我还需要能够从这些动态控件中获取数据

我知道所有的动态控件都必须在OnInit方法中创建,以便在回发期间从这些控件获取数据。但是,当触发下拉列表的SelectedIndexChanged事件时,将调用OnInit方法。。。然后页面加载。。。最后调用SelectedIndexChanged事件的处理程序。ViewState在调用OnInit和PageLoad方法后很久才恢复,因此无法知道调用OnInit时用户在列表框中选择了什么。。。这正是我需要创建动态控件的时候

所以。。。你如何解决这个问题?您是否只需要使用JavaScript编写整个页面或大部分页面


提前感谢。

我倾向于使用老式的方法来满足这种需求。我将编写更新面板中所需的所有控件,并将其Visible属性设置为false。然后,在回发时读取下拉列表的状态,并将ApprovalControlsVisible属性设置为true。这样就没有“动态”控件,而且由于Visible属性为false的控件不会呈现,因此在用户看到它们之前不会下载这些控件。

您还可以使用asp:hiddenfield并将值设置为您创建的case var。然后在上面运行一个小jQuery脚本来查看

$(document).on("change", "#ddlSelector", setControls);
然后只做一个函数,例如:

function setControls(event) { 
    event.preventDefault();
    var selector = hiddenfield.val();
}
然后,可以通过获取标签来显示/隐藏任何项目:

$("#elementName").css("display", "inline"); 
或显示,无需隐藏。 我在工作中使用它是因为有时您需要在不触发回发的情况下进行更改,但在他们使用表单时仍然收集数据


为了代码和安全性的增强,我通常避免使用jQuery处理许多事件,但是使用jQuery时DOM元素操作会更容易。

谢谢David。我以为我已经试过了,但它不起作用(我错了)。(对我来说)需要记住的一件事是,如果使用用户控件放入更新面板占位符,并且该用户控件具有导致回发的控件,则该用户控件将被隐藏,因为父页面的下拉列表的事件处理程序不会被调用,因为它不会导致回发。我解决了这个问题,让我的所有子用户控件公开一个公共事件,当它导致回发通知父页面“取消隐藏”相应的占位符时,会触发该事件。