引子

在最新发布的ExtAsp.Net v2.0.6 版本中,有一个重大更新:
------优化AJAX的内部实现,每个页面保存的ViewState现在减少1/3左右(重要更新)。
如果你对v2.0beta5和v2.0.6中一些页面ViewState大小的对比结果感兴趣的话,可以看上一篇博客。

ExtAspNet中的AJAX
在ExtAspNet的产品描述中,有这样一句话“原生的AJAX支持”,其实这也是我们非常推崇的一个特性。
所谓的“原生”就是开发人员不需要做任何设置,ExtAspNet中的PostBack默认就是一个AJAX过程。
考虑一个简单的例子:

<ext:PageManager ID="PageManager1" runat="server" />
<ext:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button">
</ext:Button>
protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Text = "Click:" + DateTime.Now.ToLongTimeString();
}

当我们点击按钮时,按钮的值被改变“Click:20:34:42”,你如果仔细观察此次PostBack并不像点击一个普通Asp.net按钮一样,
页面并没有刷新,而且在回发过程中页面右上角还显示一个红色的提示框“正在加载....”:

通过HttpWatch我们可以看到返回值为:
box.$0.enable();
box.util.setDisabledControlBeforePostBack('');
box.$0.setText('Click:20:34:42');
box.util.updateViewState('EHgRUZXh0BQ5DbGljazoyMDozNDo0Mh4DJElEBQIkMGRkCbyzBkQ+Ki5LTj9GvIiyaApDFXM=',39);

返回的其实是一串字符串,其中包括修改按钮值的JavaScript脚本:box.$0.setText('Click:20:34:42');

ExtAspNet v2.0beta5中AJAX的实现
其实想实现AJAX也很简单,我们只需要知道在本次PostBack中有哪些控件的属性发生了变化,然后对于这些变化的属性生成一段JavaScript脚本就可以了。
在ExtAspNet v2.0beta5也是基于这个简单的考虑。
1. 首先在页面第一次加载时我们把按钮的Text属性保存下来(保存到ViewState)。

// 如果不是ExtAspNetAjax回发,则保存属性到ViewState
if (!IsExtAspNetAjaxPostBack)
{
   ViewState["Text_HashCode"] = Text.GetHashCode().ToString("X8");
}

因此也就有你在这一篇文章中看到的这个截图了:

这里之所以将属性值字符串化后再取Hash值,是为了节约ViewState的大小(你想如果把多行文本框的Text保存在ViewState将会导致ViewState变的很大)。

2. 其次在AJAX回发时,我们取这个属性值和ViewState中的值比较,如果变化了则输出JavaScript脚本。

string currentText = Text.GetHashCode().ToString("X8");
if(currentText != ViewState["Text_HashCode"].ToString())
{
    // 输出 box.$0.setText('Click:20:34:42');
    ViewState["Text_HashCode"] = currentText;
}

怎么样,是不是很简单。

ExtAspNet v2.0.6中AJAX的实现
为什么会想着改进,这源于我写上一篇文章时看着满屏幕的HashCode,很是心烦。我们能否摆脱这个烦人的ViewState?
还是那个老问题:怎么知道本次回发时某个属性改变了。
其实在页面回发时,所有控件的ViewState都被重新装载了,因此我们只需要比较控件装载完ViewState的值和即将渲染到页面时ViewState的值不就可以了。
我们已经明确知道在控件中有个事件叫OnPreRender,它表示的就是在将控件渲染到页面之前的那个阶段,我们已经多次用到了。
我们只需要找到控件刚刚装载完毕ViewState的那个时刻不就可以了。
还是来看下自定义控件的生命周期:

这个时刻应该是在OnLoad之前和LoadViewState之后(也可能是LoadPostData之后),很可惜的是居然没有一个OnPreLoad事件!!
可能有网友说,你在OnLoad时检查ViewState不就行了么?
-----其实不然,控件的OnLoad执行时,Page的Page_Load已经执行结束,开发人员可能在Page_Load中已经改变了控件的属性值。

其实办法还是有的,我们为控件注册Page的OnPreLoad事件不就行么,如下代码所示:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

if (Page != null)
    {
    // 只有在ExtAspNet的AJAX回发时才注册Page.PreLoad事件
    if (IsExtAspNetAjaxPostBack)
    {
        Page.PreLoad += new EventHandler(OnPreLoad);
    }
    }
}

最后我们只需要比较控件在 OnPreLoad 时刻的属性值和OnPreRender时刻的属性值,就知道这个属性在本次PostBack是否被用户所改变了。

后记
一件问题常常有多种解决办法,先实现功能再考虑优化往往是一个正确的选择。

Happy coding.

转载于:https://www.cnblogs.com/sanshi/archive/2009/08/17/1548395.html

ExtAspNet应用技巧(七) - ViewState优化相关推荐

  1. 花书+吴恩达深度学习(七)优化方法之基本算法(Momentum, Nesterov, AdaGrad, RMSProp, Adam)

    目录 0. 前言 1. 指数加权平均(exponentially weighted averages) 2. Momentum 动量 3. Nesterov 动量 4. AdaGrad 5. RMSP ...

  2. SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办

    我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...

  3. ExtAspNet应用技巧(十九) - 日志管理

    界面截图 点击左侧"日志管理",在右侧IFrame中载入./admin/log.aspx: 选择错误级别即更新Grid: 在TwinTriggerBox中输入需要查询的关键词,回车 ...

  4. PHP 提高PHP性能的编码技巧以及性能优化

    0.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这 么做,它是 一种可以把多个字符串当作参数的"函数&qu ...

  5. 从GPU到3D渲染:游戏图形渲染技巧与性能优化

    :5月18日,Qualcomm在北京举行Qualcomm骁龙游戏与图形开发者研讨会.嘉宾们分享了GPU框架特性.移动游戏性能与功耗优化技巧,以及3D效果渲染技巧等话题. 5月18日,Qualcomm在 ...

  6. ExtAspNet应用技巧(十) - Grid导出为Excel文件(续)

    轻车熟路 书接上文,如何在使用ExtAspNet控件库的页面将Grid内容导出为Excel文件? 1. 页面声明 <ext:PageManager ID="PageManager1&q ...

  7. 网站优化有哪些技巧,网站优化实用简易教程

    网站优化是每个站长必须经历的一个长久流程,它是对网站功能.网站结构.页面布局.网站内容等要素的合理化策略,让网站设计适合搜索引擎,达到搜索引擎排名指标,通过技术对网站的整合,让网站更好的被用户和搜索引 ...

  8. 要阻止计算机通过ie访问web服务器,应该采取什么措施,防护知识IE浏览器常用反黑技巧七则...

    欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 针对IE的恶意修改.攻击方法非常多,本文中介绍的七种反黑技巧,一定会对你有所帮助. 1.管理好Cookie IE6.0 ...

  9. ExtAspNet应用技巧(三) - 302与Asp.Net Ajax

    问题描述: mgzhenhong网友提到这样的问题,并给出了示例: 1. Web.config启用Forms Authentication. <authentication mode=" ...

  10. 批量操作WinRAR实用技巧七招

    压缩文件在我们的电脑里已经是越来越多了,如何用WinRAR快速整理堆积如山的压缩文件呢?怎样快速转换压缩格式.批量删除压缩包内文件.批量提取想要的文件,还有批量添加注释.修复压缩文件及创建自解压文件呢 ...

最新文章

  1. 《Adobe Acrobat XI经典教程》—第6课转换PPT演示文稿
  2. pytorch cpu占用较高
  3. 今天 我的博客正式建立了
  4. SVM支持向量机——核函数、软间隔
  5. Chapter 1(数据结构绪论)
  6. 数字信号处理篇(一) 采样定理
  7. python循环函数怎么改变变量_python:循环定义多个变量
  8. Linux unzip命令:解压zip文件
  9. jinja LineStatements
  10. 实现应用于AlphaGo得增强式学习算法,代码实现1
  11. linux C语言基础学习总结
  12. 在3dmax中打开文件时,显示路径无效,如何处理?
  13. 为酒店设计一套计算机网络管理系统,酒店管理系统方案设计和对策.doc
  14. Java图片压缩 - 压缩到指定大小范围
  15. 【狂神说Java】SpringBoot最新教程IDEA版通俗易懂
  16. 小米、华为、一加、OPPO接连入场,电视的魅力在哪里?
  17. 基于Django的驾校在线考试系统
  18. 【蓝凌系统】如何使用数据中台进行省市县级联配置
  19. htc m8什么时候更新Android 6.0,速度够快 港版HTC M8获Android 6.0更新
  20. JS 拖拽对齐参考线+自动吸附+对齐到网格

热门文章

  1. 2010.6.20 OA项目组一周工作报告
  2. 为什么 Eureka 比 ZooKeeper 更适合做注册中心?
  3. 美团程序员吐槽公司蹲位:如厕5分钟找坑两小时
  4. 喜提 300w 硬核资产!
  5. 单身狗应该怎么过七夕节?
  6. php编写文章发布程序教程,PHP开发文章发布系统之后台文章修改处理程序
  7. ae插件form_学习人数最多的课程 (推荐)AE+PR特效剪辑全能精英班
  8. 一个特殊的SQL Server阻塞案例分析
  9. 常用的HTML5和CSS3标签及用法(入门篇)
  10. Java for LeetCode 231 Power of Two