在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的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. Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)

    GXPT它是一个分布式系统,该系统包括一个临时许可系统.基本系统.教学评价体系.考试系统,每个系统都有自己的oracle数据库.统,而评教系统的正常须要借助于权限系统和基础系统,详细的业务这里就不多解 ...

  2. js isArray小结

    原文:[转载]js isArray小结 在日常开发中,我们经常需要判断某个对象是否是数组类型的,在js中检测对象类型的常见的方法有几种: 1.typeof操作符.对于Function.String.N ...

  3. 測试之路2——对照XML文件1

    才来几天,老大又给了我一个新的任务.不像曾经的建100个任务project那么坑爹,却还是顿时让我感觉压力山大. 由于在这之前,我改了他写的例程,用于生成新的任务项目,事实上任务项目就是通过XML文件 ...

  4. spring4.2完整web项目(使用html视图解析器)

    完整配置springmvc4,最终视图选择的是html,非静态文件. 最近自己配置spring的时候,遇到很多问题,由于开发环境和版本的变化导致网友们给出的建议很多还是不能用的,可能还会有很多人会遇到 ...

  5. 项目中经常使用的JS方法汇总,非常有用

    // 对Date的扩展,将 Date 转化为指定格式的String   // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符,   // 年(y)可以用 1- ...

  6. oracle_根据表名拼装语句

    1.-----批量删除用户下所有表数据------保留表结构 eg: 批量删除用户下的所有表数据 SELECT 'TRUNCATE TALBE '||TABLE_NAME||';' FROM USER ...

  7. python_random随机

    在数据清洗,评估 ,抽验等等过程中,经常有这样的应用场景 : 需要在一个大的数据集合中随机出来样本,进行人工评估.为了保证足够随机,借助脚本来实现. 下面一个脚本  ,用于应对这种应用场景. 使用方法 ...

  8. Tomcat剖析(二):一个简单的Servlet服务器

    Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...

  9. linux_ubuntu12.04 安装 svn

    sudo apt-get install subversion sudo mkdir /home/svn sudo svnadmin create /home/svn/repository cd /h ...

  10. Swift语言指南(四)--类型安全和类型推断

    原文:Swift语言指南(四)--类型安全和类型推断 Swift是一门类型安全语言,类型安全语言需要代码里值的类型非常明确.如果你的代码中有部分值需要String类型,你就不能错误地传递Int. 鉴于 ...