Viewstate压缩问题

Dil*_*ave 5 compression asp.net 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>
Run Code Online (Sandbox Code Playgroud)

没有压缩的页面源:

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

Ras*_*ack 2

.NET 中隐藏着一个常量,用于保存视图状态字段名称。我们通过挂钩您描述的方法进行压缩,但保持视图状态名称相同,没有问题。