加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – Viewstate压缩问题

发布时间:2020-12-16 03:32:03 所属栏目:asp.Net 来源:网络整理
导读:我目前正在与.NET Viewstate斗争,它开始让我失望.我们发现其中一个应用程序中的某些页面由大约80%的viewstate组成,我已经考虑尽可能地减少这一点. 我已经看过(并且很满意)禁用viewstate以获取不需要它的控件(标签,按钮等)并在这里取得了一些小的收益. 我现
我目前正在与.NET Viewstate斗争,它开始让我失望.我们发现其中一个应用程序中的某些页面由大约80%的viewstate组成,我已经考虑尽可能地减少这一点.

我已经看过(并且很满意)禁用viewstate以获取不需要它的控件(标签,按钮等)并在这里取得了一些小的收益.

我现在正在查看视图状态压缩,虽然我可以证明大小减少了40-50%,但它似乎并不适合我的应用程序.

场景:
页面包含一些下拉列表,一个按钮和一个Grdiview(因此需要处理ViewState!).页面加载时,将填充DDL并进行默认选择.按OK按钮将导致Gridview按预期填充.

现在的问题是:启用Viewstate压缩后,如果用户在单击“确定”按钮之前更改了DDL中的选定项目,则会收到“必填字段验证程序”错误,指示尚未在其中一个DDL中进行选择 – 但是事实并非如此!禁用压缩代码可以解决问题,并且页面按预期运行(即,它已经持续数月!).

问题可能归结为现在存储在__VIEWSTATE以外的密钥中的视图状态[我见过的代码使用了不同的密钥名称 – 例如VSTATE).

我的页面来源看起来像这样;

带压缩的页面源(请注意空的__VIEWSTATE键):

<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VSTATE" id="__VSTATE" value="H4sIAAAAAEAO29B2AcSZYlJ
.
.
MKd2afqdaImFR5UiFXVyQPwLPA//8xt+pMsSQ8vlOklcoNgmZfJd8hHvk6/S/7UbxxAJTjzZfp6Qcm039
h3d3dvvPO7/Oa/7i57uemj1H2a/gw5lJQ+ySjFRtPZUL7A/3o2ImFR5UiFXVyLPA+38At70F1EkwAAA=" />
<input type="hidden" name="__VIEWSTATE" id="
__VIEWSTATE" value="" />
</div>

没有压缩的页面源:

<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTYxOTM1NDg4N
A9kFgJmD2QWAgIDD2QWAgIFD2QWAmYPZBYKAgEPZBYIAgcPZBYCAgMPDxYCHgRUZXh0BRdEYXduQyBbY2hhbm
dlIHBhc3N3b3JkXWRkAgkPFgIeB1Zpc2libGVoFgQCAQ8PFgIfAAUFQWRtaW5kZAIDDw8WAh8ABQUxNDoyNGR
.
.
.
.
.
.
kAgsPDxYEHwAFWVNlbGVjdGVkIFNlcnZpY2UgVXNlcjogPGEgY2xhc3M9J3N1U2VsZWN0b3InIGhyZWY9J2xp
c3RzZXJ2aWNldXNlcnMuYXNweCc+PGI+bm9uZTwvYj48L2E+HwFoZGQCDw8QZGQWAGQCBQ8UKwADZDwrABQEA
BYSHg9QYXJlbnRJdGVtQ2xhc3MFC2lnbW5fUGFyZW50HhdUb3BMZXZlbFBhcmVudEl0ZW1DbGFzcwUTaWdtbl
Ub3BFBhcmVudB4KSlNGaWxlTmFtZWUeFlRvcExldmVsSG92ZXJJdGVtQ2xhc3MFNGlnbW5fVG9wTGV"     
/>
</div>

.NET如何知道VIEWSTATE的存储位置,是否知道我已经移动了它?

除了实现SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium之外,我是否需要对我的代码进行任何其他更改?

解决方法

嘿viewstate压缩对我没有任何问题.基本上我有一个使用viewstate的所有aspx页面的基类.即使我使用不同的viewstate键来保存我的viewstate.但是你必须为此重写2个方法:

1) – 保存视图状态
2) – 加载viewstate

只要你这样做,你应该没有问题.看下面我用于我的基类的代码

using System;
using System.IO;
using System.Web.UI;

namespace XC.UI.WebForms
{

    public class PageBase : System.Web.UI.Page
    {

        protected override object LoadPageStateFromPersistenceMedium()
        {
            string viewState = Request.Form["__VSTATE"];
            byte[] bytes = Convert.FromBase64String(viewState);
            bytes = XC.Common.ViewStateHelper.Decompress(bytes);
            LosFormatter formatter = new LosFormatter();
            return formatter.Deserialize(Convert.ToBase64String(bytes));
        }

        protected override void SavePageStateToPersistenceMedium(object viewState)
        {
            LosFormatter formatter = new LosFormatter();
            StringWriter writer = new StringWriter();
            formatter.Serialize(writer,viewState);
            string viewStateString = writer.ToString();
            byte[] bytes = Convert.FromBase64String(viewStateString);
            bytes = XC.Common.ViewStateHelper.Compress(bytes);
            ClientScript.RegisterHiddenField("__VSTATE",Convert.ToBase64String(bytes));
        }

    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读