ASP.NET WebForm Best Practice 之PostBack
关于PostBack,我曾经也写过一篇博客《深入理解 __doPostBack》。在这篇文章里有对PostBack进行了一些研究,现在看来研究的还是不够深入。不过从原理上来说,ASP.NET WebForm中的一般WEB控件(为什么是一般呢?因为如Button等少数控件不是调用__doPostBack方法的)在向服务器回发请求时,调用的就是__doPostBack方法,通过表单提交的方式来向服务器提交请求。而WebForm所提供的WEB事件模型也是以__doPostBack这个方法为基础的,往服务器传送的两个隐含变量(__EVENTTARGET,__EVENTARGUMENT)就是PostBack事件分发的根据。__EVENTTARGET保存着向服务器发出PostBack请求的控件ID,ASP.NET根据这个ID就可以找到它所对象的服务器端控件的实例。__EVENTARGUMENT保存的是当前PostBack的一些参数。除此之外,PostBack还需要什么条件呢?
在前段时间关于WebForm和MVC的讨论中,有人提到禁用了ViewState,也就无法使用了PostBack。这也给我提了一个醒,确实ViewState与PostBack有非常紧密的关系,在大多数情况下,如果控件的状态是动态维护的。比如说DropDownList的Items是通过下面的代码添加的:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: if (!this.IsPostBack)
4: {
5: DropDownList1.Items.Add(new ListItem("1", "Value1"));
6: DropDownList1.Items.Add(new ListItem("2", "Value2"));
7: }
8: }
而不是在HTML页面上静态添加(或是在OnInit事件之前添加,不能加IsPostBack的判断),这时,如果禁用ViewState,那么DropDownList的SelectedIndexChanged事件将不会被正常触发,并且DropDownList的Item项将会被清空。所以从这个角度来说,如果要使用PostBack,那么ViewState势必不能被禁用。
除此之外,PostBack还有一些不足:
1)页面在PostBack后,刷新页面时会出现非常不好的用户体验。
2)搜索引擎的不友好。
3)在编写服务器端代码时要特别的小心,特别是对IsPostBack的判断。
尽管PostBack在WebForm的事件机制占有举足轻重的地位,它出现极大的方便了我们以事件驱动方式来开发WEB应用。从短期的入门应用中确实有它重要的意义。但从现实出发,还是必须得根据不同的应用场合有先择性的使用。在网站前台型应用中,应该消灭一切可以消灭的PostBack。因为做为前台,它的作用就是展示还有查询。而如果对查询,分页等操作使用PostBack的话,一方面搜索引擎的不友好,另一方面给大多数用户带来非常不好的用户体验,增加了整个页面的请求时间。同时,它们所传的参数又非常有限,这情况下就需要使用链接的方式来传参。
对于应用型的后台开发,由于在提交数据时可能会有比较多的表单数据。这时,这时结合DetailView或FormView,使用PostBack来提交数据又可以给我们带来非常大的方便,这种情况下我们不禁用ViewState也没有关系,ViewState并不会很大,而至于刷新的问题,我们可以使用UpdatePanel来帮助解决。但是如果对于浏览数据仍然是要特别注意,特别是有GridView的页面进行PostBack数据查询,分页时,尽量都能改成链接的方式来实现。
总体来说,PostBack的使用还是要特别注意,能少用就少用,但有时用它确实也会给我们带来非常大的方便。对于应用型的后台开发,如果使用EXT的话,那么就是可以完全摒弃WebForm,或MVC了。因为它有自己一整套完整的开发流程,从目前来看,确实是一种全新的体验。
连续两篇讨论的PostBack和ViewState,可能结论都是偏向消极的。它们的存在有其重要意义的同时,难免会带来一些负面影响,但这种影响的代价在很多情况下过大而导致大多数人的反唇相讥。在软件工程中,衡量软件的标准不是越快越好,而是在用户接受的合理的时间范畴内,得到正确的结果,并且它所花费的代价(包括开发,维护,部署等成本)是最少的。我相信只要使用得当,它们还是可以充分发挥它们的作用的。
从极端的来说,去掉PostBack和ViewState后,WebForm仍然还是WebForm。它只是少了两样两把利弊同样明显的双刃剑,它余下的事件机制,组件化开发,页面模型仍然是我们进行WebForm开发最有力的武器。
ASP.NET WebForm Best Practice 之PostBack相关推荐
- 通过HTTP抓包,深入理解ASP.NET WebForm ViewState
为什么80%的码农都做不了架构师?>>> 上周完成了一个从ASP.NET WebForm 开发的站点抓包的功能.该功能要求使用该网点内的帐号通过我们自己的程序获取网站内的数据. ...
- (转)教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- asp.net webform 与asp.net mvc 混合开发项目总结
公司里的一个web项目 运行速度比较慢(原来是asp.net webform 建立的时候是通过新建网站 不是web项目) 这个项目最早是VS2003 做的时候asp.net也不是很熟悉 订单登记的页 ...
- asp.net webform html,ASP.NET WebForm页面内容输出方式
这次我们谈的话题是"Web Form页面上输出内容的方式".这其实是一个非常旧的话题了,因为本文的内容甚至可以运用于ASP.NET 1.1之上.不过这个话题的适用范围很广,因为即使 ...
- 【原】ASP.Net WebForm的发布(图解)
全文包括如下三部分内容: 方式一.发布网站至默认的IIS路径下 方式二.发布网站至指定的IIS路径下 注:发布过程中可能出现的错误信息及解决方法 --------------------------- ...
- Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
Ext.Net是一个对ExtJS进行封装了的.net控件库,可以在ASP.NET WebForm和MVC中使用.从今天开始记录我的学习笔记,这是第一篇,今天学习了如何在WebForm中使用Ext.Ne ...
- 利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)
本文将介绍如何利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序,分为上下两篇.上篇主要介绍实现,下篇主要介绍界面. 打开Visual ...
- 实现 ASP.NET WebForm Client
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 1. 下载.NET CAS client. .NET CAS Client ...
- ASP.NET WebForm和Mvc开发的比较
在初步了解MVC后,发现很多人对于MVC和三层架构开发概念上会有很大的混淆,所以把这两天的学习笔记整理一下,分享给自己的同学们.同时也做一个小Demo,让没有接触过MVC开发的同学,能对MVC有一个简 ...
最新文章
- 新浪程序员加班改bug,竟错失77万年会大奖
- 原创 | 《相机标定》深入理解原理与实战(一)
- 如何读emmc里的引导程序_自制操作系统学习1 引导程序
- oracle替换表merge,sql – Oracle – 如何使用merge根据其他表和列中的值更新列
- php errorcode,php中pdo错误处理方法详解
- java ajax 获取headers_Ajax获取Response头信息
- 一图看懂云栖大会「云原生」发布
- Arcmap坐标系转换通用教程【简单明了】
- 96道前端面试题+前端常用算法
- python开源项目之五子棋
- U盘插入计算机不显示图标,U盘插入电脑后不显示图标的应对措施
- 记录下一个带内购的iOS app的上架App Store历程
- BBRv2 Cruise 阶段的 inflight 补偿
- word 2007 无法输入汉字,怎么办?
- arduino电风扇程序_Arduino实验项目:温控电风扇
- 【ARM Cache 入门及渐进五--内存屏障ISB/DSB/DMB】
- elasticsearch springboot 实现分词搜索
- 线性子空间和仿射子空间
- Android-谷歌语音识别之离线识别(二)
- 计算机关机键消失了,电脑关机按钮不见怎么办 电脑关机图标不见解决办法
热门文章
- Error: EBUSY: resource busy or locked, lstat ‘D:\DumpStack.log.---基于Vue的uniapp手机端_前端UI_uview工作笔记004
- Linux防火墙端口设置和mysql端口开放的navicat整合
- 排列组合算法之一: 01转换法_java改变后的c++版
- oracle中多个数据库连接池,数据库连接池为什么要建立多个连接
- 随想录(smp的一些注意事项)
- 一步一步写算法(之双向链表)
- 什么是php渲染,php数据渲染输出
- python服务端语言_使用Python实现简单的服务器功能
- tomcat启动成功 未加载项目_新里程|尚品食品国际贸易合伙人项目成功启动
- linux 文件 16进制显示,linux 16进制 产看文件