当前位置: 首页 > 编程语言 > C#

ASP.NET中的Viewstate和控件分享

时间:2023-04-10 12:17:36 C#

ASP.NET中的Viewstate和控件前几天发了一个关于viewstate的问题,经过一番测试,得出了一些结论/结果。基于这些结果,我对某人如何做某些事情有一些疑问。以下是我运行的测试的结果:如果usercontrolA从页面的OnInit加载,那么他的视图状态将在OnLoad中可用。usercontrolA从其OnInit加载的所有其他控件将在其OnLoad时准备好它们的视图状态。如果usercontrolA是从Page的OnLoad加载的,那么他的视图状态将在OnPreRender中可用。usercontrolA从其OnLoad加载的所有其他控件将在其OnPreRender中提供它们的视图状态。如果usercontrolA是从事件加载的(例如:按钮单击。在OnLoad之后和OnPreRender之前触发的事件),那么他的视图状态将不可用。usercontrolA加载的所有其他控件将不会提供它们的视图状态。因此,在一个完美的世界中,您总是使用情况#1来加载所有控件,以便它们的视图状态在它们的OnLoad上可用。不幸的是,当您需要从按钮单击或OnLoad加载控件时,是否没有办法控制在OnPreRender阶段之前获取其视图状态?我已经阅读了很多关于视图状态的文章并且认为我理解它,但是在我当前加载用户控件的应用程序上加载其他用户控件,我真的很难在我的叶子上获取视图状态(最后在链中))用户控件。任何建议和/或链接表示赞赏。在OnInit中加载动态控件是公认的做法,以便它们获得完整的控件生命周期。我不确定我是否特别了解您的情况-如果您是根据按钮单击加载控件,为什么此时会有视图状态?在下一个OnInit上,您应该再次加载控件(我通常使用页面级别的Viewstate项来跟踪需要加载哪些特定控件),以便它可以从Viewstate恢复。类似于:classDefault:Page{enumLoadedControl{Textbox,Label,GridView}overrideOnInit(){if(IsPostback){varc=Viewstate["LoadedControl"]asLoadedControl;如果(c!=null)LoadDynamicControl(c);}}voidButton_Click(){varc=(LoadedControl)Enum.Parse(typeof(LoadedControl),ddl.SelectedValue);加载动态控制(c);}voidLoadDynamicControl(LoadedControlc){switch(c){caseLoadedControl。文本框:this.ph.Controls.Add(newTextbox());休息;...}ViewState["LoadedControl"]=c;然而,更有趣的是,根据追赶事件——这真的无关紧要。动态加载控件的调用栈类似:Control.Controls.Add(Control)Control.AddedControl(Control)Control.LoadViewStateRecursive(object)Control.LoadViewState(object)以Label为例,会覆盖LoadViewState,直接从ViewState提取其Text属性。文本框是相似的。因此,根据我的阅读,您始终可以添加然后访问ViewState。但是,根据我的经验,这似乎并不合适,因此需要进一步调查。我认为我无法添加本文未涵盖的任何内容。特别注意生命周期事件部分。http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx我很惊讶但对您的结果很感兴趣。当我使用动态控件时,我总是将它们添加到Page_Init中。没有别的工作。但你是对的——如果你添加它们来响应按钮点击,你会怎么做?我发现的唯一方法是检查PageInit中的Request.Form("__EVENTTARGET")集合。这包含触发回发的控件的控件ID,例如按钮单击。它当然会由它出现的命名容器限定。一旦您以这种方式确定了“事件”,您就可以添加所需的控件。这当然有点老套,但这是我发现做这些事情的唯一方法。有用。有趣的是,如果在Page_Load中添加控件,ViewState就可以在PreRender中使用。但是,正如上面的链接所暗示的那样,为时已晚。控制状态在加载循环期间被再水化。如果它不存在,那么您的控制状态或动态控制将消失。您是否尝试过使用LoadComplete事件?将此事件用于需要在页面上加载所有其他控件的任务。这是在PageLoad和所有事件(ButtonClick等)之后触发的,因此您的UserControls在ButtonClick事件中加载,并且在LoadComplete中它们的ViewState已经初始化。以上就是《C#学习教程:ASP.NET中的Viewstate和控件》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: