在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的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通过现象看本质的更多相关文章

  1. [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)

    https://www.douban.com/note/284947308/?type=like 学习技术的三部曲:WHAT HOW WHY 我把学习归类为三个步骤:What.How.Why.经过我对 ...

  2. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  3. GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)

    前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...

  4. 《C# 从现象到本质》出版,免费送书10本

    我的第一本书<C# 从现象到本质>已于近日正式在京东和淘宝天猫上开始销售了.至此,我的图书写作和出版活动正式告一段落.图书销售网址见下. 试读样章 京东 天猫 从看书到写书 借着图书出版之 ...

  5. 《C#从现象到本质》读书笔记(九)第11章C#的数据结构

    <C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...

  6. 《C#从现象到本质》读书笔记(八)第10章反射

    <C#从现象到本质>读书笔记(八)第10章反射 个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成 ...

  7. 《C#从现象到本质》读书笔记(七)第9章 泛型

    <C#从现象到本质>读书笔记(七)第9章 泛型 泛型的三大好处:类型安全,增强性能(避免装箱和拆箱),代码复用. 泛型方法是传入的参数至少有一个类型为T(尚未制定的类型,根据微软的命名规则 ...

  8. 《C#从现象到本质》读书笔记(六)第8章委托和事件

    <C#从现象到本质>读书笔记(六)第二部分 C#特性 第8章委托和事件 从这一部分开始,知识点就相对少了,重要的是代码练习.奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的. 委托 ...

  9. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

    <C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...

随机推荐

  1. 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)

    原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...

  2. Ruby: Count unique elements and their occurences in an array

    Is there a method in Ruby that takes an array, and counts all unique elements and their occurrences ...

  3. gcd&&lcm

    1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入2个正整数A,B,求A与B的最大公约数.   Input 2个数A,B,中 ...

  4. Nyoj 天下第一(spfa)

    描述 AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是“人在江湖漂,怎能 不挨刀",”人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Gr ...

  5. 查询记录rs.previous()使用

    查询记录rs.previous()使用 假如查询一个数据表,假设没有记录就显示提示信息.有就所有显示出来查询结果.这时假设是有查询结果的话就须要进行两次查询.第一次查完记录指针指向最后一条记录.開始第 ...

  6. Swift初体验(两)

    // 写功能初体验 func getMyName(firstName first:String, lastName last:String) -> String{ //return first ...

  7. T4模版引擎之基础入门

    额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又在背后默默无闻的奉献着,直到现在我们项目组的人除了我之外,其它人还是对其豪无兴趣,基本上是连看一眼都懒得看,可怜的娃啊... T4(T ...

  8. cocos2d 游戏开发实战

    文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 & ...

  9. C#中如何获取系统环境变量

    原文:C#中如何获取系统环境变量 C#中获取系统环境变量需要用到Environment Class.其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承. 以下代码得到%systemd ...

  10. Android注入事件的三种方法比较

    方法1:使用内部APIs 该方法和其他所有内部没有向外正式公布的APIs一样存在它自己的风险.原理是通过获得WindowManager的一个实例来访问injectKeyEvent/injectPoin ...