AutoPostBack通过现象看本质
在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的AutoPostBack属性。本以为这个问题就这样解决了(不用javascript、jquery、ajax),但是在实现的过程中确发现没那么简单。
何为AutoPostBack
AutoPostBack是asp.net中众多服务器控件中的一个属性,如TextBox、Lable、RadioButton、CheckBox、GridView等等。如果AutoPostBack属性值设置为true,当控件的值或状态改变时,客户端即浏览器会将这一变化请求传回到服务器,当然服务器也会对这一变化做出响应。所以依靠控件的这一属性客户端就可以做到实时的与服务器交互,如填写表单时可以实时验证输入的信息是否规范,不过这样做会加重服务器的负担。假设一个网站需要注册个人信息,每个人填写完一条都需要服务器进行验证和响应,会大大加重服务器的负担,所以对于表单验证这样的事情通常交给客户端来处理,这样就减轻了服务器负担。
AutoPostBack+javascript
这次遇到的问题主要是在GridView中每一行有单选按钮和数据,我们需要根据选中的行拿到后边与之对应的数据。解决这个问题首先要注意的是gridview中的控件和数据都是根据后台数据生成的即数据跟控件都是动态的。对于单选按钮要实现单选必须设置单选按钮的GroupName属性使他们处于同一组中.设置单选的GroupName=“xuanzze”代码运行后查看网页源代码会发现gridview的name="ctl00_ContentPlaceHolder1_gridView",RadioButton的name="ctl00$ContentPlaceHolder1$gridView$ctl02$xuanze",此时的单选按钮都是在gridview中动态生成的,设置的GroupName属性在代码运行时会失去作用.解决的方法是利用javascript当进行选择时遍历所有RadioButton,把RadioButton的name属性设置为同一值。单选的问题解决了,但随之而来的是RadioButton的AutoPostBack属性设置失效了,即后台与RadioButton的OnCheckedChanged对应的方法不在执行。
用例测试一:AutoPostBack
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="radionTest.aspx.cs" Inherits="Testcookie.radionTest" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用例一</title>
</head>
<body>
<form id="form1" runat="server" >
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:radiobutton ID="Radiobutton1" runat="server" AutoPostBack="true" OnCheckedChanged="Radio_OnCheckedChanged" ></asp:radiobutton>
</form> </body> </html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Testcookie
{
public partial class radionTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void Radio_OnCheckedChanged(object sender, EventArgs e)
{
String word = TextBox1.Text;
if(RadioButton1.Checked==true)
{
Response.Write(word);//当单选按钮选中时打印输出文本框内容
}
}
}
}
在表单中加入一个RadioButton服务器控件,一个TextBox控件,将RadioButton的AutoPostBack属性设置为true,让RadioButton的与OnCheckedChanged属性对应的方法输出文本框的内容。代码运行,断点调试发现单击单选按钮后后台方法会从Page_Load方法开始执行即相当于重新加载页面。
用例测试二:AutopostBack+Javascript
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="radionTest.aspx.cs" Inherits="Testcookie.radionTest" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用例二</title>
</head>
<body>
<form id="form1" runat="server" >
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:radiobutton ID="Radiobutton1" runat="server" AutoPostBack="true" OnCheckedChanged="Radio_OnCheckedChanged" onclick="return alert("警告!")" ></asp:radiobutton> </form> </body> </html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Testcookie
{
public partial class radionTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void Radio_OnCheckedChanged(object sender, EventArgs e)
{
String word = TextBox1.Text;
if(RadioButton1.Checked==true)
{
Response.Write(word);//当单选按钮选中时打印输出文本框内容 }
}
}
}
在用例一的基础上给RadioButton的添加Onclick事件:onclick="return alert("警告!")",发现AutoPostBack属性设置又无效了。把RadioButton的OnClick事件删除,运行代码结果AutopostBack属性正常,后台代码也运行。根据这一结果猜测是RadioButton的Onclick事件对AutoPostBack属性的设置起了作用。
用例测试三 JS模拟AutoPostBack
根据用例的测试结果猜测是RadioButton的OnClick的Javascript函数影响了AutoPostBack属性。AutoPostBack实现实时与后台数据交互是如何实现的?初步猜测是跟js有关。
用例测试三:AutoPostBack+javascript(提交表单)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="radionTest.aspx.cs" Inherits="Testcookie.radionTest" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>用例三</title>
<script language="javascript" type="text/javascript">
function ty() {
document.getElementById("form1").submit();//提交表单
}
</script>
</head>
<body>
<form id="form1" runat="server" >
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:radiobutton ID="Radiobutton1" runat="server" AutoPostBack="true" OnCheckedChanged="Radio_OnCheckedChanged" onclick="return ty()" ></asp:radiobutton>
</form> </body> </html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Testcookie
{
public partial class radionTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void Radio_OnCheckedChanged(object sender, EventArgs e)
{
String word = TextBox1.Text;
if(CheckBox1.Checked==true)
{
Response.Write(word);//当单选按钮选中时打印输出文本框内容 }
}
}
}
在用例三中用RadioButton的OnClick事件提交表单,发现JS运行了,也实现了AutoPostBack属性的效果。在网上查了很多的资料,大多都是介绍AutopostBack的基本功能就如上面介绍的一样,没有找到AutoPostBack实现机制有关的资料。
总结与发现
利用javascript提交表单实现了AutopostBack要实现的效果,但是还是不敢确定AutopostBack的实现机制。 最后在查询msdn的过程中发现国外的也有人问这个问题:what is autopostback?
对于这个问题的回答,大部分人的回答都是浅显的介绍了AutopostBack属性的功能,并没有解释AutopostBack的实现机制。不过看到页面的最后还是看到一些兴奋的信息。
Re: what is autopostback?
Mar 02, 2011 09:07 AM|LINK
Postback occurs when you submit a form using button or javascript.
By default Dropdowns, checkboxes, radiobuttons don't have server side event. ASP.Net makes use of javascript to give server side events to these conrols. Hence if you want these controls to do postback you need to set Autopostback = true. Once done whenever you do any change to these controls a javascript method called as __doPostback is called which submits the form thus causing postback。
大致的意思是:
当你利用提交按钮或javascript提交表单时PostBack就会发生。Dropdowns、CheckBox、RadioButto这些控件在服务器端并没有相应的事件,Asp.net中利用javascript给这些控件添加事件从而实现PostBack。所以如果当你需要PostBack时需要将AutopostBack属性设置为true。无论什么时候一旦控件发生改变就会自动触发一个名为__doPostback的提交表单的js函数。
AutoPostBack通过现象看本质的更多相关文章
- [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)
https://www.douban.com/note/284947308/?type=like 学习技术的三部曲:WHAT HOW WHY 我把学习归类为三个步骤:What.How.Why.经过我对 ...
- 透过现象看本质:Java类动态加载和热替换
摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...
- GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)
前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...
- 《C# 从现象到本质》出版,免费送书10本
我的第一本书<C# 从现象到本质>已于近日正式在京东和淘宝天猫上开始销售了.至此,我的图书写作和出版活动正式告一段落.图书销售网址见下. 试读样章 京东 天猫 从看书到写书 借着图书出版之 ...
- 《C#从现象到本质》读书笔记(九)第11章C#的数据结构
<C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...
- 《C#从现象到本质》读书笔记(八)第10章反射
<C#从现象到本质>读书笔记(八)第10章反射 个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成 ...
- 《C#从现象到本质》读书笔记(七)第9章 泛型
<C#从现象到本质>读书笔记(七)第9章 泛型 泛型的三大好处:类型安全,增强性能(避免装箱和拆箱),代码复用. 泛型方法是传入的参数至少有一个类型为T(尚未制定的类型,根据微软的命名规则 ...
- 《C#从现象到本质》读书笔记(六)第8章委托和事件
<C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...
- 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
<C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...
随机推荐
- 一步一步的理解C++STL迭代器
一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...
- AngularJS与ASP.NET MVC登录超时解决方案
问题: 1.在Action中判断Ajax请求的方法Request.IsAjaxRequest()始终是false 2.返回给前台StatusCode和HttpUnauthorizedResult,前台 ...
- Codeforces 443 B. Kolya and Tandem Repeat
纯粹练JAVA.... B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megab ...
- 《Javascript权威指南》十六学习笔记:BOM资源---BOM基本应用
BOM基本应用包括:管理浏览器历史记录.得到处理和解决浏览器的信息.本文介绍了这些应用程序. 一.浏览历史管理 1.history对象的方法和属性 History 对象包括用户(在浏览器窗体中)訪问过 ...
- 十天学Linux内核之第七天---电源开和关时都发生了什么
原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...
- HBase写的初步测试中的表现
底 第四年HBase.在上线的机HBase集群做一个初步的测试写入性能.下面具体说明做测试内容. 说明 HBase周围环境 0.96版本号,8台region server.默认配置 写数据说明 单co ...
- javascript系列之this
原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...
- javascript系列之DOM(一)
原文:javascript系列之DOM(一) DOM(document object moudle),文档对象模型.它是一个中立于语言的应用程序接口(API),允许程序访问并修改文档的结构,内容和样式 ...
- 蜗牛—JSP学习乘法表页面输出
<%@page import="java.text.SimpleDateFormat" pageEncoding="utf-8"%> <%@ ...
- iOS开发- "duplicate symbol for architecture i386" 解决的方法
今天整合项目的时候, 遇到了这样一个问题. duplicate symbol _flag in: /Users/apple/Library/Developer/Xcode/DerivedData/bl ...