避免使用viewstate在网站源代码上显示

时间:2013-10-01 14:01:40

标签: asp.net viewstate

我在网站上遇到了性能问题,因为源代码中的viewstate太长了。在某些页面上,它的大小超过15-20kb。这增加了浏览器的加载时间。

有没有办法部分或完全禁用viewstate而不会对网站的其他模块造成任何伤害。仅供参考,这些示例页面上有一个列表视图和一个表单。 viewstate非常长。

更多示例页面

http://www.pricingindia.in/coupons/ebay-in-coupon-codes-20

http://www.pricingindia.in/coupons/flipkart-coupon-codes-32

3 个答案:

答案 0 :(得分:2)

您可能希望一般为您的Page禁用ViewState,然后仅为需要/使用它的控件启用ViewState。

请参阅this MSDN page on the Control.ViewStateMode property,它介绍了如何进行设置:

  

禁用页面的视图状态并为特定页面启用它   控制页面,设置页面的EnableViewState属性和   将控件设置为true,将页面的ViewStateMode属性设置为   禁用,并将控件的ViewStateMode属性设置为   启用。

您需要进行一些测试,以查看哪些控件需要/使用特定应用中的ViewState。但是,基本上,

  • 任何静态的东西,你可以禁用ViewState(Buttons,LinkBut​​tons等)。
  • 在PostBacks之间不需要恢复其状态的任何控件,您可以禁用ViewState(例如,提交到服务器的表单中的TextBox,然后清除)。
  • 任何需要在PostBack之间保持状态的控件,你想启用Viewstate(这通常是数据绑定控件,如GridViews /等)。

这样做绝对可以减少ViewState对你网页的负担。

答案 1 :(得分:1)

好吧,我不能独自离开:

Firebug表示,以下一些代码阻止该网站呈现大约6秒钟。我认为这是jsapi(基于来自chrome工具的信息),但是以下内容返回了“502 Bad Gateway”消息,这意味着它在那里旋转它的轮子无法处理,同时阻止您的网页显示。

我会将<script ..调用移动到它所属的标题。然后我将google.loadgoogle.setOnLoadCallback移到网页底部,使其最后运行。

最后,我弄明白为什么它无法正常工作。

为您做好准备:将Firebug加载到Firefox中,并学习如何使用它的Net工具查看网站加载问题。

<div class="sr_bx1 FL clearfix">
 <div class="FL searchbg">
         <div id='cse' style='width: 100%;'>Loading</div>
        <script src='http://www.google.com/jsapi' type='text/javascript'></script>  
        <script type='text/javascript'>
            google.load('search', '1', { language: 'en', style: google.loader.themes.V2_DEFAULT });
            google.setOnLoadCallback(function () {
                var customSearchOptions = {};
                var orderByOptions = {};
                orderByOptions['keys'] = [{ label: 'Relevance', key: '' }, { label: 'Date', key: 'date'}];
                customSearchOptions['enableOrderBy'] = true;
                customSearchOptions['orderByOptions'] = orderByOptions;
                var imageSearchOptions = {};
                imageSearchOptions['layout'] = 'google.search.ImageSearch.LAYOUT_POPUP';
                customSearchOptions['enableImageSearch'] = true;
                customSearchOptions['overlayResults'] = true;
                var customSearchControl = new google.search.CustomSearchControl('010882286766777081969:xkox132izzk', customSearchOptions);
                customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
                var options = new google.search.DrawOptions();
                options.setAutoComplete(true);
                customSearchControl.draw('cse', options);
            }, true);
        </script>

</div>               

答案 2 :(得分:1)

使用Page Adapter Class,您可以解决此问题。我发现以下解决方案对ASP.NET Web应用程序有用:

视图状态序列化由PageStatePersister类型的对象处理。 (PageStatePersister类是一个抽象类,它定义了将视图状态序列化为某些持久介质的基本级功能。)

<强>步骤: 1)在您的Web应用程序中,添加文件夹:App_Browsers 2)在此文件夹中,添加新的浏览器文件:ViewStateAdapter.browser 3)在其中编写以下代码:

<browsers>
    <browser refID="Default">
      <controlAdapters>
        <adapter controlType="System.Web.UI.Page" adapterType="ServerSideViewStateAdapter" />
      </controlAdapters>
    </browser>
</browsers>

4)在您的WebApplication中,添加文件夹:App_Code 5)在此文件夹中,添加新的ClassFile:ServerSideViewStateAdapter.cs 6)在其中编写以下代码:

using System;
using System.Web.UI;
using System.Web.UI.Adapters;
public class ServerSideViewStateAdapter : PageAdapter
{
    public override System.Web.UI.PageStatePersister GetStatePersister()
    {
        return new SessionPageStatePersister(this.Page);
    }
}

您可以参考此视频,它可以帮助您:

https://www.youtube.com/watch?v=36pmFySbXZA