标签ASP.ViewState实现中的错误?

时间:2009-05-15 13:08:03

标签: asp.net viewstate

编辑2:嗯,我去了代码。注意他们在这里做了什么。他们说加载viewstate,然后转身并将Text属性设置为viewstate中的内容。通过viewstate跟踪打开后调用LoadViewState,这会导致我看到的行为。我认为代码应该说的是:

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。

这是一个错误吗?这可能预期的行为如何?

3 个答案:

答案 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控件中的一个错误。