全面分析PostBack之Client Script

2023-11-20 18:18

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

全面分析PostBack之Client Script

 -Written by 浪子@cnblogs.com (2006.08.14) [JavaScript]自定义MessageBox ,我还剩下一个问题没有解决,即"如何获取control的完整的客户端代码"?。所以本文解决的问题只涉及PostBack的客户端Script,而不涉及服务端的PostBack机制如何运作。
问题描述:
继上文
 
问题分析:
PostBack有2种方式
1、 通过__doPostBack(eventTarget, eventArgument),例如LinkButton;
2、 通过form的submit方式,例如采用 UseSubmitBehavior Button
   
对于button,可能会有三种绘制方式:
1、 button的UseSubmitBehavior为true,并且没有触发验证事件;
采用form的submit方式,不需要描绘script
2、 button的UserSubmitBehavior为false,并且没有触发验证事件;
采用__doPostBack函数
3、 button有触发验证事件:
采用WebForm_DoPostBackWithOptions(options)函数

function  WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)  {
    
this.eventTarget = eventTarget;
    
this.eventArgument = eventArgument;
    
this.validation = validation;
    
this.validationGroup = validationGroup;
    
this.actionUrl = actionUrl;
    
this.trackFocus = trackFocus;
    
this.clientSubmit = clientSubmit;
}

 
function  WebForm_DoPostBackWithOptions(options)  {
    
var validationResult = true;
    
if (options.validation) {
        
if (typeof(Page_ClientValidate) == 'function') {
            validationResult 
= Page_ClientValidate(options.validationGroup);
        }

    }


    
if (validationResult) {
        
if ((typeof(options.actionUrl) != "undefined"&& (options.actionUrl != null&& (options.actionUrl.length > 0)) {
            theForm.action 
= options.actionUrl;
        }

        
if (options.trackFocus) {
            
var lastFocus = theForm.elements["__LASTFOCUS"];
            
if ((typeof(lastFocus) != "undefined"&& (lastFocus != null)) {
                
if (typeof(document.activeElement) == "undefined"{
                    lastFocus.value 
= options.eventTarget;
                }

                
else {
                    
var active = document.activeElement;
                    
if ((typeof(active) != "undefined"&& (active != null)) {
                        
if ((typeof(active.id) != "undefined"&& (active.id != null&& (active.id.length > 0)) {
                            lastFocus.value 
= active.id;
                        }

                        
else if (typeof(active.name) != "undefined"{
                            lastFocus.value 
= active.name;
                        }

                    }

                }

            }

        }

    }


    
if (options.clientSubmit) {
        __doPostBack(options.eventTarget, options.eventArgument);
    }

}



 
 
问题解决:
我需要的是采集PostBack的Client Script,所以只需要获取__doPostBack或者WebForm_DoPostBackWithOptions(options)函数,以便传给KMessageBox进行事件挂载。
按上面的分析我们已经知道什么情况下使用__doPostBack,什么情况下使用WebForm_DoPostBackWithOptions(options )。

  分析一下Reflector出来的Button源码:
 
    有了这段代码,我们就可以很清晰的得到服务端如何决定采取什么方式来绘制客户端的PostBack Script了

DoPostBackWithOptions

   
IButtonControl button  =  (IButtonControl)control;

                    
if  ((button.CausesValidation  &&  ( this .Page.GetValidators(button.ValidationGroup).Count  >  0 ))  ||  ! string .IsNullOrEmpty(button.PostBackUrl))
                    
{
                        strOnClickScript 
= string.Format(gDoPostBackWithOptions, control.ClientID, button.CommandArgument, button.CausesValidation.ToString().ToLower(), button.ValidationGroup, button.PostBackUrl, "false""true");
                    }

                    
else
                    
{
                        strOnClickScript 
= Page.ClientScript.GetPostBackEventReference(control, button.CommandArgument);
                    }


     至此KMessageBox服务端的封装工作全部结束。做到,不影响原来的编码方式,只需要简单的执行一下KMessageBox的RegisterConfrim函数为control注册一下客户端事件就搞定一切。  
OnPreRender

这篇关于全面分析PostBack之Client Script的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3