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

让asp.net在会话中存储视图状态而不是添加html分享

时间:2023-04-10 21:22:06 C#

让asp.net在会话中存储视图状态而不是添加html.现在我读到asp.net附带了SessionPageStatePersister,可以使用它代替默认的HiddenFieldPageStatePersister来执行此操作。我想知道我是怎么放下它的?这是我目前所拥有的:我想我需要创建一个从GetStatePersister方法返回SessionPageStatePersister的PageAdapter,并以某种方式让页面使用这个pageadapter。但是Page.PageAdapter只有一个getter,所以我不确定你是如何设置它的。请参阅此处的“备注”标题:http://msdn.microsoft.com/en-us/library/system.web.ui.hiddenfieldpagestatepersister.aspx谢谢!要使用自定义PageAdapter类,它必须在.browser文件中注册。您需要添加(如果尚未添加)App_Browsers目录。然后添加具有以下XML的.browser文件,将{youradaptertype}替换为您的适配器类型。更多信息在这里希望这有帮助。你确定你要这么做吗?问题如何将各个页面分开?当然,您可以在会话状态名称前加上页面前缀,例如。Session["/default.aspx-Viewstate"]但是当用户打开页面的多个实例时会发生什么?因此,要解决此问题,您可以在每个页面中放置一个隐藏字段,例如GUID,并将其用作键。所以你的会话大小会增加。并成长。并成长。您如何知道/何时可以安全移除物品?如果你硬要按这个读取,那么你需要做的就是从Page派生一个类并重写LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium()。但你会恨自己,最终撕毁它。只需确保在您的服务器上打开HTTP压缩,相信其余的。对于它的价值,这是我最终用来解决手头的大图像问题的代码:将视图状态移出html。只需要将其弹出到mypage.aspx.cs://灵感来自:http://aspalliance.com/72conststringViewStateFieldName="__VIEWSTATEKEY";conststringRecentViewStateQueue="RecentViewStateQueue";constintRecentViewStateQueueMaxLength=5;protectedoverrideobjectLoadPageStateFromPersistenceMedium(){//此视图状态的缓存键存储在视图状态通常所在的位置,因此获取它stringviewStateKey=Request.Form[ViewStateFieldName]asstring;如果(viewStateKey==null)返回null;//使用键从缓存中获取视图状态数据以查找它stringviewStateData=Cache[viewStateKey]asstring;如果(viewStateData==null)返回null;//反序列化returnnewLosFormatter().Deserialize(viewStateData);}protectedoverridevoidSavePageStateToPersistenceMedium(objectviewState){//序列化视图状态信息StringBuilder_viewState=newStringBuilder();StringWriter_writer=newStringWriter(_viewState);新的LosFormatter().Serialize(_writer,viewState);//给这个视图状态一个随机键字符串viewStateKey=Guid.NewGuid().ToString();//将视图状态存储在缓存中Cache.Add(viewStateKey,_viewState.ToString(),null,Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(Session.Timeout),CacheItemPriority.Normal,null);//将视图状态的缓存键存储在视图状态隐藏字段中,因此在回发时我们可以从缓存中获取它ClientScript.RegisterHiddenField(ViewStateFieldName,viewStateKey);//一些整理:跟踪该用户的X个最近的视图状态,并删除旧的varrecent=Session[RecentViewStateQueue]asQueue;if(recent==null)Session[RecentViewStateQueue]=recent=newQueue();最近入队(viewStateKey);//添加这个新的,以便稍后将其删除while(recent.Count>RecentViewStateQueueMaxLength)//如果队列中有很多,则删除旧的Cache.Remove(recent.Dequeue());}对使用SessionPageStatePersister的超简单方法,再放到mypage.aspx.cs中:以上是C#学习教程:让asp.net在session中保存视图状态,而不是把html分享的内容全加进去,如果对大家有用,需要的话了解更多关于C#学习教程,希望大家多多关注—protectedoverridePageStatePersisterPageStatePersister{get{returnnewSessionPageStatePersister(this);}}本文收集自网络,不代表立场。明源: