gpt4 book ai didi

asp.net - View 状态压缩问题

转载 作者:行者123 更新时间:2023-12-04 17:29:14 26 4
gpt4 key购买 nike

我目前正在与 .NET Viewstate 作斗争,它开始让我感到疲倦。发现我们的一个应用程序中的某些页面由大约 80% 的 View 状态组成,我已经考虑尽可能减少这种情况。

我已经看过(并且很高兴)为不需要它的控件(标签、按钮等)禁用 View 状态,并在这里取得了一些小收获。

我现在正在查看 View 状态压缩,虽然我可以证明大小减少了 40-50%,但它似乎与我的应用程序配合得不好。

设想:
页面包含几个下拉列表、一个按钮和一个 Grdiview(因此需要处理 ViewState!)。当页面加载时,会填充 DDL 并进行默认选择。按“确定”按钮会按预期填充 Gridview。

现在的问题是:启用 Viewstate Compression 后,如果用户在单击“确定”按钮之前更改 DDL 中的选定项目,他们将收到“必需字段验证器”错误,指示尚未在其中一个 DDL 中进行选择 - 但这不是这样的!禁用压缩代码可消除问题,页面按预期运行(即几个月以来一直如此!)。

问题是否可以归结为现在存储在 __VIEWSTATE 以外的键中的 View 状态 [我看到的代码使用不同的键名 - 例如 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 之外,我是否需要对我的代码进行任何其他更改?

最佳答案

嘿, View 状态压缩对我来说没有任何问题。基本上,我的所有使用 viewstate 的 aspx 页面都有一个基类。即使我使用不同的 View 状态键来保存我的 View 状态。但是,您必须为此覆盖 2 个方法:

1) - 保存 View 状态
2) - 加载 View 状态

只要你这样做,你应该没有问题。请参阅下面我用于基类的代码

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));
}

}

}

关于asp.net - View 状态压缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/721518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com