有关减少旧系统上ViewState大小的建议

JSu*_*uar 1 vb.net asp.net viewstate optimization drop-down-menu

我已经找到了减少ViewState的方法:

但是,由于我所处的情况,我需要最快捷,最有效的方法来减少ViewState的大小.我正在研究的遗留系统很臃肿,并且在多个回发中通常具有800Kb +的ViewState.

例如,我很确定在多个帖子上填充100多个项目的下拉列表是其中一个罪魁祸首,对吗?

任何建议/意见将不胜感激.

编辑1 完全禁用ViewState似乎不可行.它打破了所有控件,其中有很多控件,使页面无法使用.如果这是最好的方法,我该如何处理所有损坏的控件?

Joe*_*ano 5

如果你有关于他们的许多项目下拉列表,如果这些下拉列表中的内容可以很容易地在页面回传被检索,然后这些内容不应被放入视图状态.相反,应在每次回发时在服务器上重新填充下拉列表.典型的例子是下拉列表,其中包含50个州的列表.将此内容放入视图状态是没有意义的.此数据可以缓存在服务器上,用于在每次回发时重新填充下拉列表,而不是在每次往返时将此数据来回传递给客户端.

那么如何将内容绑定到下拉列表而不将其添加到viewstate,并且不关闭控件的viewstate?答案在于理解ASP.Net事件管道.在OnInit页面事件之后调用TrackViewState()方法时,Viewstate跟踪生物.TrackViewState()执行后以编程方式对控件进行的任何更改都将放入viewstate.所以,如果你在Page_Load事件中的数据绑定下拉列表,下拉列表中的全部内容将得到投入视图状态,你经常不想要的.

因此,如果您不希望将下拉列表内容序列化为viewstate,则必须在执行TrackViewState()方法之前进行数据绑定.执行此操作的最佳位置是下拉列表的Init事件.因此,简而言之,在其Init中填充下拉列表,下拉列表内容不会被序列化到viewstate中.当然,由于内容不在视图状态,因此您需要在每次回发时重新填充它.但是,如果内容被缓存并且检索起来很便宜(例如,使用50个状态的列表),那么这不是问题.

示例:假设您有一个名为"dropDownList1"的下拉列表,您可以在名为GetData()的方法中检索包含列表内容的List.您可以在page_load事件中填充此列表:

    protected void Page_Load(object sender, EventArgs e)
    {
        //Content of dropdown list will be serialized into viewstate
        dropDownList1.DataSource = GetData();
        Page.DataBind();
    }
Run Code Online (Sandbox Code Playgroud)

但是如果你这样做,内容将被序列化到viewstate.如果您在其Init事件中填充列表:

    protected void dropDownList1_Init(object sender, EventArgs e)
    {
       //Content of dropdown list will NOT be serialized into viewstate
       GetData().ForEach(item => this.dropDownList1.Items.Add(item));
    }
Run Code Online (Sandbox Code Playgroud)

内容不会被序列化到viewstate中.只要检索此内容很便宜,就应该这样做.

有关这方面的更多信息,请参阅有关Infinities Loop的优秀文章.这是我在viewstate上看过的最好的文章,通过理解本文的内容,我们能够在我们的网页上更智能地开始使用viewstate,并大大减少了viewstate的大小.