if(s!= Text){Text = s;}。这将完全摆脱这个问题,并保持他们需要的任何不变量。
/// <internalonly/>
/// <devdoc>
/// <para>Load previously saved state.
/// Overridden to synchronize Text property with LiteralContent.</para>
/// </devdoc>
protected override void LoadViewState(object savedState) {
if (savedState != null) {
base.LoadViewState(savedState);
string s = (string)ViewState["Text"];
if (s != null)
Text = s;
}
}
编辑:在我的所有测试中,这似乎只影响Label控件。我仍然认为这是一个错误。
这是一个ASP.NET 3.5网站。
请考虑以下.aspx页面: (html,head,body等剪断)
<form id="form1" runat="server">
<asp:Label runat="server" ID="label1">
This is a lot of text.
This is a lot of text.
This is a lot of text.
This is a lot of text.
This is a lot of text.
This is a lot of text.
This is a lot of text.
</asp:Label>
<asp:Button runat="server" ID="button1" Text="Click" OnClick="button1_Click" />
<script>
document.write(document.getElementById("__VIEWSTATE").value.length);
</script>
</form>
该页面后面有以下代码:
protected void button1_Click(object sender, EventArgs e) {
//label1.AccessKey = "a";
}
是的,该行已注释掉。来了。因此,当您单击该按钮时,您将看到viewstate是52个字节。即使标签有很多文本,当然viewstate的工作方式是它不需要在viewstate中保存大量文本,因为Text属性的初始值从未改变过。好。到现在为止还挺好。这是所有预期的行为。实际上,即使标签包含1兆字节的文本,视图状态大小仍然是52字节。好。现在将方法更改为
protected void button1_Click(object sender, EventArgs e) {
label1.AccessKey = "a";
}
我们改变什么属性并不重要。现在单击按钮。 ViewState大小最多为92个字节。好的40个字节来存储一个字符的访问密钥,如果你问我但是有点多:)现在,再次点击按钮。现在的观点大小是多少?应该是92字节对吗?不,它是 480 。再单击它,它保持480字节大小。发生了什么?更改label属性会导致标签开始在视图状态中存储标签TEXT。什么????在标签上贴上100K的文字,你会看到视图状态达到~100K。
这是一个错误吗?这可能预期的行为如何?
答案 0 :(得分:3)
它不仅存储一个字符,还需要存储它适用的属性。
有关viewstate如何工作的详细信息,请参阅http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx。
尽管可能存在viewstate可能与您期望的行为不同的方式,但由于viewstate对ASP.NET的工作方式至关重要,因此不太可能存在任何错误。
答案 1 :(得分:1)
ASP.NET dev here :)和viewstate文章的作者提到。
作为我自己而不是MS,只是为了清楚。是的 - 这是一个错误。为了解释为什么代码在看似没有必要的时候设置属性(因为值已经存储在ViewState中 - 为什么设置它会将它再次放回ViewState中?)。如果你看一下Text的setter,你会发现除了将值设置为ViewState之外,它还会调用Controls.Clear()。这是因为Label支持将子控件作为“文本”以及文字字符串。如果它没有在LoadViewState中设置Text属性,那么它可能会错误地呈现控件而不是文本或其他内容。
它应该以更好的方式解决这个问题 - 不确定你提到的修正提议是否适用于所有情况。
答案 2 :(得分:0)
是。这是Label控件中的一个错误。