我已经阅读了很多关于页面如何因过度使用 Viewstate 而陷入困境的文章,我不确定是否使用逗号分隔的字符串(可能是 3-4 个单词)并将其拆分为数组
string s = 'john,23,usa';
string[] values = s.Split(',');
检索会有所帮助,因为我看到我的许多同事正在这样做,大概是为了提高页面加载性能。任何人都可以建议吗?
实际上,在某些情况下它确实会有所不同,但它看起来很棘手并且通常是无关紧要的。
请参阅以下案例:
这些示例ViewState
以字节为单位显示大小,这意味着没有任何内容的页面会产生 68 字节ViewState
。其他所有内容都是手动加载到ViewState
.
将字符串值 0..9999 放在ViewState
.
string x = string.Empty;
for (int i = 0; i < 10000; i++)
{
if (i != 0) x += ",";
x += i;
}
//x = "0,1,2,3,4,5,6,7,8...9999"
ViewState["x"] = x;
//Result = 65268 bytes
并带有一个数组:
string[] x = new string[10000];
for (int i = 0; i < 10000; i++)
{
x[i] = i.ToString();
}
ViewState["x"] = x;
//Result = also 65268 bytes
ViewState
当在可覆盖方法上返回时,上述两种情况都会导致 65260 字节SaveViewState
。ViewState
比将其加载到对象上少 8 个字节。
但是,在其他一些情况下:
//104 bytes
ViewState["x"] = "1,2,3,4,5,6,7,8,9,10"
// 108 bytes
ViewState["x"] = new string[] { "1", "2", "3" , "4", "5", "6", "7", "8", "9", "10"}
如果您覆盖页面SaveViewState
方法:
protected override object SaveViewState()
{
//100 bytes
return new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
//100 bytes
return "1,2,3,4,5,6,7,8,9,10";
}
由于ViewState
是加密的,Base64 encoded,
在某些情况下,它可能只是对两个不同对象进行字符串编码的问题,这些对象会为页面生成两个不同的输出。