2010-11-04 127 views
1

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

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

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

在此先感谢。

回答

0

我倾向于使用旧式的方法来满足这种类型的需求。我将编写更新面板中所需的所有控件,并将其Visible属性设置为false。然后,在回帖中阅读下拉的状态并将适当的控件Visible属性设置为true。这种方式没有“动态”控件,并且由于其Visible属性为false的控件未呈现,因此只有在用户看到它们时才会下载它们。

+0

谢谢大卫。我以为我试过这个,并没有工作(我错了)。有一件事(对我来说)要记住的是,如果您使用用户控件进入更新面板占位符并且该用户控件具有导致回发的控件,则用户控件将被隐藏,因为父页面的下拉列表事件处理程序不会被调用,因为它不会导致回发。我解决了这个问题,让我所有的孩子用户控件公开一个公共事件,当它引发一个回传,通知父页面“取消隐藏”相应的占位符时,它会触发。 – 2010-11-04 18:57:26

0

您还可以使用asp:hiddenfield并将该值设置为您在心智上创建的案例变量。然后在上面运行一个小的jQuery脚本来看看

$(document).on("change", "#ddlSelector", setControls); 

然后只是做一个功能,比如:

function setControls(event) { 
    event.preventDefault(); 
    var selector = hiddenfield.val(); 
} 

那么任何项目显示/隐藏可以获取标签来完成:

$("#elementName").css("display", "inline"); 

或display,none to hide。 我在工作中使用了这个功能,因为有时您需要更改而不触发回传,但在他们使用表单时仍然收集数据。

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