IsPostBack深入分析

2023-10-27 18:08
文章标签 深入分析 ispostback

本文主要是介绍IsPostBack深入分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、IsPostBack 介绍 
IsPostBack是 Page类有一个 bool类型的属性,用来判断针对当前 Form的请求是第一次还是非第一次请求。当 IsPostBack= true时表示非第一次请求,我们称为 PostBack,当 IsPostBack= false时表示第一次请求。在 asp.net框架内部有很多的场景需要判断 IsPostBack,比如 LoadAllState等操作就需要在 PostBack的时候进行。对于我们自己使用 WebForm进行开发时,经常会在 Page_Load中对 IsPostBack进行判断,因为第一次请求的时候会执行 Page_Load,在非第一次请求的时候也会执行 Page_Load。为什么对同一个 Form有多次请求呢? asp.net中引入了服务器端事件,支持服务器端事件的控件,会发出对当前 Form的请求,这样在很多情形下我们就需要区别是否是对这个 Form的第一次请求。 

2、IsPostBack 结论 
本人对 .Net的源代码中相关的处理进行的分析得到如下的结论: 
结论①    对于使用 Server.Transfer进行迁移时迁移到的页面其 IsPostBack= false。 
结论②    Post方式如果 Request中没有请求值,即 Request.Form =null则 IsPostBack= false; Get方式如果 Request中没有请求值,即 Request.QueryString =null则 IsPostBack= false。 
结论③    如果QueryString或Form虽然有请求值,但是QueryString或Form中的Key没有“__VIEWSTATE”和 “__EVENTTARGET”和“__VIEWSTATEFIELDCOUNT”,并且没有键为“null”,值以“__VIEWSTATE”开头并且也没有值为“__EVENTTARGET”的键值对,则IsPostBack=false。 
结论④    使用 Response.Redirect方式向自画面迁移时,此时 IsPostBack =false。 
结论⑤    发生跨页提交( CrossPagePostBack),当访问 PreviousPage属性的时候,对于源 Page, IsPostBack=true。 
结论⑥    发生跨页提交( CrossPagePostBack)时目标页面是 IsPostBack= false
结论⑦    使用 Server.Execute迁移到的页面其 IsPostBack= false。 
结论⑧    在 Page运行期间其对应的 DLL被更新了并且 Page的树结构发生过变化,这种情况下请求时 IsPostBack= false。 
可以这样来理解这些结论:一般情况判断 Request中如果没有请求值则 IsPostBack= false。如果有请求值但是不包括 “__VIEWSTATE”等一些特殊的键或值,则 IsPostBack= false(每次请求后 .Net框架会将一些特殊的隐藏域“ __VIEWSTATE ”等返回给客户端)。还有一些特殊的情形是上面的规则不能正确判断的需要特殊处理的,这些情形包括 Server.Transfer, Response.Redirect, CrossPagePostBack, Server.Execute,发生了页面元素变化及重新编译。 
一般来说记住上面的结论就可以,如果您有兴趣,或者怀疑请继续看下面的 IsPostBack推论过程。 
3、IsPostBack 推论过程 
下面是根据 .Net框架中的源代码,来分析 IsPostBack是如何判断出来的。对于这些结论的推断本人做了相关的试验来证明推论的正确性,由于篇幅的原因没有将这些试验代码体现出来。另外不可能将全部的 .Net框架的代码都体现出来,只是将相关的代码片段列出,说明推断的依据。另外由于本人水平有限对 .Net框架的代码理解还存在的不足的地方,请发现后进行指正,谢谢。 

public bool IsPostBack 

    get  
    { 
        if (this._requestValueCollection == null )  
        { 
            return false ;  
        } 
        if (this ._ isCrossPagePostBack )  
        { 
            return true ;  
        }

        if (this _pageFlags [8]) 

        {

            return false ; 

        }

   return ( 

(

(this.Context .ServerExecuteDepth <= 0 ) || 

((this.Context .Handler != null ) && 

(base.GetType () == this .Context .Handler .GetType ())) 

) && !this._ fPageLayoutChanged 

);

    }

}

我们将每一个 if判断作为一个小节,作如下的分析。 

3.1  this._requestValueCollection == null 

if (this._requestValueCollection == null ) 

{

            return false ; 

}

可以看出 _requestValueCollection等于 null时 IsPostBack就等于 false。 

在 Page.ProcessRequestMain(bool , bool ) 中有如下的代码: 

if (this .PageAdapter != null ) 



    this ._requestValueCollection = this .PageAdapter.DeterminePostBackMode(); 



else 



    this ._requestValueCollection = this .DeterminePostBackMode(); 



PageAdapter.DeterminePostBackMode 最终还是调用了 Page.DeterminePostBackMode ,下面我们看 Page.DeterminePostBackMode 如何实现。 

protected internal virtual NameValueCollection DeterminePostBackMode() 



    if (this .Context.Request == null ) 

    { 

        return null ; 

    } 

    if (this .Context.PreventPostback) 

    { 

        return null ; 

    } 

    NameValueCollection collectionBasedOnMethod = this .GetCollectionBasedOnMethod(false ); 

    if (collectionBasedOnMethod == null ) 

    { 

        return null ; 

    } 

    bool flag = false ; 

    string [] values = collectionBasedOnMethod.GetValues((string ) null ); 

    if (values != null ) 

    { 

        int length = values.Length; 

        for (int i = 0; i < length; i++) 

        { 

            if (values[i].StartsWith("__VIEWSTATE" , StringComparison .Ordinal) || 

(values[i] == "__EVENTTARGET" )) 

            { 

                flag = true ; 

                break ; 

            } 

        } 

    } 

if (((collectionBasedOnMethod["__VIEWSTATE" ] == null ) && (collectionBasedOnMethod["__VIEWSTATEFIELDCOUNT" ] == null )) && ((collectionBasedOnMethod["__EVENTTARGET" ] == null ) && !flag)) 

    { 

        return null ; 

    } 

if (this .Request.QueryStringText.IndexOf( 

HttpResponse .RedirectQueryStringAssignment, StringComparison .Ordinal) != -1) 

    { 

        collectionBasedOnMethod = null ; 

    } 

    return collectionBasedOnMethod; 



这个函数中返回 null就意味者 IsPostBack= false,将上面函数中每个返回为 null的地方作如下的分析。 

3.1.1  this.Context.Request == null 

    if (this
.
Context.Request
 == null)
    {        return null
;
    }this.Context.Request == null 应该只有在异常的情况下会发生,正常情况下会在 HttpRuntime.ProcessRequestInternal 中创建 HttpContext及 HttpRequest对象。 

3.1.2 this.Context.PreventPostback 

    if (this
.
Context
.PreventPostback)    {        return null
;
    }在 HttpServerUtility.Transfer 中会使用 PreventPostback ,其代码如下: 

        public void Transfer(string path) 

        { 

            bool preventPostback = this ._context.PreventPostback; 

            this ._context.PreventPostback = true ; 

            this .Transfer(path, true ); 

            this ._context.PreventPostback = preventPostback; 

        } 

在调用 Server.Transfer进行画面迁移时设置 Context.PreventPostback = ture。此处得出结论①:对于使用 Server.Transfer进行迁移时迁移到的页面其 IsPostBack= false。

这篇关于IsPostBack深入分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/287429

相关文章

【大数据Java基础- Java并发 20】深入分析synchronized的实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Javs S

【GameFramework框架】7-1、GameFramework框架深入分析

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录:

优化采样参数提升大语言模型响应质量:深入分析温度、top_p、top_k和min_p的随机解码策略

当向大语言模型(LLM)提出查询时,模型会为其词汇表中的每个可能标记输出概率值。从这个概率分布中采样一个标记后,我们可以将该标记附加到输入提示中,使LLM能够继续输出下一个标记的概率。这个采样过程可以通过诸如 temperature 和 top_p 等参数进行精确控制。但是你是否曾深入思考过temperature和top_p参数的具体作用? 本文将详细解析并可视化定义LLM输出行为的

深入分析网络编程中容易踩的坑

目录 1.TCP没考虑粘包分包 2.UDP没考虑丢包 3.长连接没考虑应用层心跳 4.大小端字节序问题 5.多线程发送乱序问题 6.大数据没考虑分片和流量控制 7.外网没考虑加密通信 8.客户端没考虑断线重连 1.TCP没考虑粘包分包   TCP是面向连接的可靠协议,TCP是流式协议,创建TCP套接字的类型为SOCK_STREAM int sockfd = socket(

ASP.NETnbsp;Page.IsPostBack

有关if (!IsPostBack):        经常有人忘记写if (!IsPostBack)结果导致提交后取不到用户所选择的列表的值,因为Page_Load先执行,控件被重新初始化了。        所以,如果你是通过服务器控件触发事件来进行数据库更新的话,在你的page_load事件中把所有程序放在if (!IsPostBack)里面,否则你会发现显示的总是第一次载入的值。

深入分析 Dart 集合源码

本篇文章将继续 Dart 中集合,不过本篇文章将会深入 Dart 集合源码分析。看过集合源码小伙伴都知道 dart:core 包中的集合实际上是委托到 dart:collection 包中实现的,所以下面我也会从源码的角度去把两者联系起来。当然这里也只会选择几个常用的集合作为介绍。 1. List 在 Dart 中 List 集合,它没有委托 dart:collection 包中集合实现,完全

深入分析 Dart 集合操作符源码

上篇文章我们详细介绍了有关 Dart 集合操作符函数的基本使用,那么这篇文章将会从源码角度,分析其内部原理。通过它你将会理解什么是惰性迭代器。 1. forEach 函数源码解析 void forEach(void f(E element)) {//可以看到在 forEach 内部实际上就是利用 for-in 迭代,每迭代一次就执行一次 f 函数,//并把当前 element 回调出去fo

Spring_MVC深入分析

资源下载: Springmvc_pdf阅读 Spring_MVC核心配置文件实例.rar     作者:赵磊 博客:http://elf8848.iteye.com   目录  一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mv

手工清理Linux后门:深入分析与实践指南

手工清理Linux后门:深入分析与实践指南 后门概述 后门程序允许未授权用户绕过正常的认证过程,获取对系统的访问权限。攻击者可能会通过修改计划任务、开机启动脚本,甚至植入Rootkit来维持后门。 分析操作系统被动手脚 在清理后门之前,首先需要分析系统可能被动了哪些手脚: 计划任务:检查/etc/cron.d/和/var/spool/cron/目录下的计划任务。开机启动脚本:检查/etc

深入分析并可视化城市轨道数据

介绍 中国城市化进程加速中,城市轨道交通的迅速扩张成为提升城市运行效率和居民生活品质的关键。这一网络从少数大城市延伸至众多大中型城市,映射了经济飞跃和城市管理现代化。深入分析并可视化城市轨道数据,对于揭示网络特性、评估效率、理解乘客行为及预测趋势至关重要,它不仅指导政府决策和城市规划,也通过简化复杂信息增进公众理解,助力形成共识。 数据概览 1.数据集表中各列含义说明如下: 最左边的是城市