啊哈,时隔两个月,才开始写上一篇文章的后续,实在是惭愧.主要是年尾公司又来活了,忙得团团转,而且这段时间在自学mvc.我在上文中,提到过我对mvc框架的初步印象是:相比webform,算是回归了bs本质.这段时间的学习,也算是验证了这一点,没有了神(qi)奇(guai)的viewstate,所有前后端交互通过http请求向control或者其他的HttpHandel集中处理或是中转,整个流程的数据流转非常清晰.

  额,其实本来这个系列,我是很有一些东西想深入讲讲的,但学了mvc之后,才发现原来很多东西mvc框架早已经考虑到了,那我也就不讲太多了,本文即是这个系列的最后一文,还有,不知道小伙伴们看没看出来,我的标点符号全是半角的,额 这是因为我设置了强制使用半角,因为我被写代码过程中频繁的输入法转换弄烦了,如果给大家的阅读造成了一定程度的困扰,还请见谅. 好了,扯这么多废话,还不进入主题,估计看得人要骂人了.

  接上文:

  1,普通事件回发,请求提交人是form,http返回的数据就是整个页面的html代码,

页面会刷新 会休眠2s RequestCount +1。

这无疑是最不优美的做法,不仅网络数据传输量大,还需要重新请求一次页面head中声明引用的文件,虽然大部分情况有缓存,但还是会有一定的性能损耗。

2事件回发 通过up的AsyncPostBackTrigger 提交 提交人是form,http返回被up包裹部分的html代码及一些参数信息(个人无责任猜测,是给ScriptManager准备的,然后ScriptManager通过js(运行在客户端)修改页面的html来完成信息无刷新显示),

页面不会刷新 会休眠2s RequestCount +1

3 jquery ajax提交 提交人就是它自己,不是表单(同时这个时候的ispostback是为false的,这也是我注释要说明的东西,ajax如果在后面处理,页面会认为是第一次加载,会执行if里面的逻辑了)

最后 就是本文的肉戏了,页面无刷新 不会休眠   RequestCount 不变。

查看http,返回的信息非常简单,就是response.write的信息,

同时大家可以做个试验,把休眠两秒的逻辑注释,然后狂点两种无刷新按钮,明显的,jquery方式的ajax流畅的多。

4,表单提交,如果在up里面和2一样 在外面和1一样。

我先对这四种(第四种其实可以算是两种情况)情况做更进一步的解释.

第一种,就是我们常见的,最原始的处理手法,相当于是重新请求的目标页面一次,众所周知,http请求是无状态的,它也不会管你是第几次访问,反正你发起了请求,我就按asp.net框架的流程,按你设置的httpmodel, httphandel给你处理一遍.           ,iis也是从转发request到响应response

第二种呢? 首先我们可以知道,后台httphandel(我们自己写的页面类继承了Page,而Page实现了IHttpHandel接口,所以我这里说的httphandel就是我们写的页面类)处理http的逻辑,和第一种应该是一样的,为什么能够无刷新呢?

我上面的猜测,虽说是猜测,但也不是我自己瞎猜的,

给大家看下无刷新的http请求的数据

可以发现,第一,只有一条http请求被发起,第二相比常规post提交,提交的请求头里面,有个&__ASYNCPOST=true的标识,第三,response返回的信息里面,只有区区5行数据,而这5行,很明显,就是被UpdatePanel包裹的控件的html代码,和一些它自己使用的参数.

大家再自行观察一下常规post提交的数据,对比是比较明显的.

至于第四种,当提交按钮,没有被updatePanel包裹的时候,不受UP的影响,是完全等同于常规post提交了,如果放在up中,就会等同于第二种情况.

这里额外提一个我自己使用up遇到过的问题,就是我页面里面有个隐藏控件(runat Server),动态保存当前某个状态,但是我局部刷新,同时后台去改变hiddenfiled的值,结果发现hf的值并没有被改变,其实是因为我hf控件没有放在up里面,不受它的管理.所以局部刷新的时候,hf的值还是原来的值,尽管这时候它在viewstate中的值是新的.

好了,重点来了,第三种情况的无刷新是个怎么回事呢?

先上jb

  可以看出,它提交的信息非常简洁,而且全是我们手工自定义进去的,没有其他多余的信息,可以想象,这种方式毫无疑问可以带来很大的灵活性.

我解释下它的流程

先看前端:

 $(document).ready(function () {
        $("#btnClentPost").click(function () {
            $.ajax({
                type: "POST",
                data: "act=updateResult&cmsg=append from ajax",
                success: function (msg) {
                    $("#lblReault").html("this is from ajax server:" + msg);
                }
            });
        });
    });

这就发起了一个http请求,

 success: function (msg) {
                    $("#lblReault").html("this is from ajax server:" + msg);
                }

指的是,当httphandel处理完之后发回response,就会触发后面的匿名函数(事件)msg是response返回的信息,这个事件有几种重载,功能有细小差别,这里就不多谈了.

当http请求被发起,目标httphandel就会接受到这个请求,这里需要这种强调下的是,我没有声明action,所以它默认的就是当前页面,你完全可以自己指定action(url),也就是httphandel,

嗯,再引申一下,大家看到我不断提到httphandel,而没怎么提page aspx,ashx之类的字眼,其实也是为了贯彻我这系列文章的主线----http.

关于aspx和ashx哪个好,是不是应该每个ajax请去都建立一个ashx,这些涉及到架构设计方面的东西,我这里也不多谈,不管是webservice 还是Page页,还是wcf接口,web api什么的,在我这里,一视同仁的认为是httpHandel,它们只干两件事

1接收并处理request请求

2返回response

在我的例子中,httphandel就是后台Page页(再次强调,你可以任意定制它的httphandel)

 protected void Page_Load(object sender, EventArgs e)
        {
            string action = Request["act"];
            if (!string.IsNullOrEmpty(action))
            {
                switch (action.ToLower())
                {
                    case "updateresult":
                        ShowAjaxChange(Request["cmsg"]);
                        break;
                    case "getsectionpoint":
                        break;
                }
            }//后续省略

前台jquery发起了ajax请求之后,经过asp.net的pipeline和httpmodel的一系列处理流程,最终page_load被调用

进入ShowAjaxChange

 //接收ajax传递过来的数据,并通过Response 做出处理
        private void ShowAjaxChange(string cMsg)
        {
            Response.Clear();
            Response.Write("S receive : " +cMsg +" Time : "+ DateTime.Now.ToString("HH:mm:ss fff"));
            Response.End();
        }

我需要解释下 Response.End(); 这句话是非常重要的,它代表的是 强制结束本次request的后续流程,返回response,

所以page_load里面我标记的  //后续省略   的代码,都是不会执行的,这也是我前面附加的一些奇怪说明的原因,也是它没有两秒休眠的原因.

当然这里是因为我为了写代码方便,和让业务逻辑代码集中的一个做法,如果你们用其他类型的httphandel,可能就不需要这样做了,用前面总结的话来说,就是,你只需要正确的处理这个http请求,返回正确的response,就一切ok!!

好了,这个系列算是写完了,也算是有始有终,可喜可贺啊!!(话说其实也只有3篇文吧,不过对于我这种写作小白来说,还是比较不容易的,呵呵)

由于以前我博客是在csdn写的,直接导入过来,好像格式会有点问题,有时间再调整(但愿我有).

还有的没说完的话,也留在后续的mvc系列里面讲吧,不过以我现在的mvc水平,大概是好久之后了.

最后,前面我提到了,jquery的原生ajax,它的自定义性很强,其实用途也是非常广泛多样的,我也准备写一个我认为比较有趣的用例,算是这个系列的补充.

CS Coder学习asp.net5个月的最大感悟:从http的角度重新认识asp.net(二)——我理解的ajax(二)的更多相关文章

  1. ASP.NET5,MVC 6,Beta 7与VS 2015 RTM的兼容问题

    温馨提示:本文杂而乱,最终不知所云. Visual Studio 2015 RTM已经于2015年7月20号正式发布,我也在第一时间下载安装了起来. 虽然在5月份就开始使用RC版本,但是还是很期待正式 ...

  2. 让ASP.NET5在Jexus上飞呀飞

    就在最近一段时间,“Visual Studio 2015 CTP 5”(以下简称CTP5)发布了,CTP5的发布不仅标志着新一代的VisualStudio正式发布又向前迈出了一步,还标志着距离ASP. ...

  3. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...

  4. ASP.NET5

    ASP.NET5 2015年11月30日, ASP.NET 5 RC1 已经发布,本文尝试了一下ASP.NET5项目的创见一发布到IIS.开发环境,win10 64位,visual studio201 ...

  5. 了解ASP.NET5 Web应用程序结构

    本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...

  6. Hello ASP.NET5

    2015年11月30日, ASP.NET 5 RC1 已经发布,本文尝试了一下ASP.NET5项目的创见一发布到IIS.开发环境,win10 64位,visual studio2015(已更新upda ...

  7. VS2015 ASP.NET5 Web项目

    VS2015 ASP.NET5 Web项目结构浅析   前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本 ...

  8. 从ASP.NET 升级到ASP.NET5(RC1) - 翻译

    前言 ASP.NET 5 是一次令人惊叹的对于ASP.NET的创新革命. 他将构建目标瞄准了 .NET Core CLR, 同时ASP.NET又是对于云服务进行优化,并且是跨平台的框架.很多文章已经称 ...

  9. ASP.NET5使用FaceBook登录

    原版教程 使用VS2015创建Web应用: 此教程使用的是FaceBook账号登录,需要添加相关的类,打开Nuget: 搜索Microsoft.AspNet.Authentication.Facebo ...

随机推荐

  1. 列出场景对象Lightmap属性

    首先上效果图: 编辑器代码: using UnityEngine; using UnityEditor; using System.Collections; public class Lightmap ...

  2. C#窗体 流

    流:(I/O)输入输出流 分类:文件流,内存流,网络流 流的操作一般要放在try catch里面,操作文件网络容易出现异常 命名空间:using system .IO;using system .Te ...

  3. 【转】打造属于自己的Android Studio神器

    本文转载自:http://www.stormzhang.com/android/2015/05/26/android-tools/,并加以修改.黄色底部分是本人添加的内容. 一晃好久没更新博客了,最近 ...

  4. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

  5. Hough 变换

    作用 霍夫变换是常用的图像变换,用于在图像中寻找直线.圆.椭圆等这类具有相同特征的几何图形.在许多应用场合中,都需要实现对特定形状物体的快速定位,而霍夫变换由于其对方向和噪声不敏感,因此在这类应用中发 ...

  6. Flex Builder 开发语言切换问题

    1.Flex Builder 4.6切换语言 打开\Adobe\Adobe Flash Builder 4.6\FlashBuilder.ini -nlzh_CN-startupeclipse/plu ...

  7. 面向对象编程思想(前传)--你必须知道的javascript

    在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...

  8. pro asp.net mvc 5笔记

    1.Ninject条件绑定方法When(predicate)WhenClassHas<T>()WhenInj ectedInto<T>()例: kernel.Bind<I ...

  9. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  10. 第2章 GNS3和PacketTracer网络模拟器(1)_GNS3概述

    1. 安装和配置GNS3 1.1 GNS3概述 (1)GNS3是一款具有图形化界面,可运行在多平台(包括Windows.Linux.Mac OS等)上面的网络虚拟软件. (2)可以在虚拟环境中运行Ci ...