客户端触发服务器端事件

asp.net在客户端触发服务器端事件分为两种情况:
一.   WebControls 中的 Button HtmlControls 中的 Type submit HtmlInputButton
这两种按钮最终到客户端的表现形式为: < input type="submit" value="Submit"> ,这是 Form 表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的:
控件的 name 属性 = 控件的 value 值,对应上面的例子就是: Submit1= Submit 。服务器端会根据接收到的控件的 name 属性的这个 key 来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
二.   HtmlControls 中的 Type button HtmlInputButton 和其它所有的控件事件,比如 LinkButton 点击, TextBox Change 事件等等:
这些事件在客户端产生后会经过一个统一的机制发送到服务端。
1. 首先 asp.net 页框架会使用两个 Hidden 域来存放表示是哪个控件触发的事件,以及事件的参数:
< !― 表示触发事件的控件,一般是这个控件的 name -->
< input type="hidden" value="" />
< !― 表示触发事件的参数 , 一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->
< input type="hidden" value="" />
2. 服务端会生成一个 jscript 的方法来处理所有这些事件的发送,这段代码是:
< script language="javascript" type="text/javascript">
    function __doPostBack(eventTarget, eventArgument)
    {
        var theform = document.WebForm2;
        theform.__EVENTTARGET.value = eventTarget;
        theform.__EVENTARGUMENT.value = eventArgument;
        theform.submit();
    }
< / script >   

3. 每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:
比如, HtmlControls 中的 Type button HtmlInputButton 的点击事件
< !― 客户端的点击事件调用 __doPostBack eventTarget 参数为 'Button2' ,表示是 name 'Button2’ 控件触发的事件, eventArgument 为空,表示这个 Type button HtmlInputButton 只有一个客户端触发的服务端事件 -->
< input language="javascript" Button2','')" type="button"   value="Button" />
又比如, TextBox 控件的 Change 事件
< !― 客户端的 onchange 事件调用 __doPostBack eventTarget 参数为 ’TextBox1’ ,表示是 name ’TextBox1’ 控件触发的事件,而 TextBox 控件只有一个客户端触发的服务端事件 TextChanged ,故服务器就会去触发这个 TextBox TextChanged 事件 ->
< input type="text" TextBox1','')" language="javascript" />
4. 客户端触发事件后调用 __doPostBack 方法,将表示触发的控件源的 eventTarget 和事件参数 eventArgument 分别付给两个隐藏域 __EVENTTARGET __EVENTARGUMENT ,然后提交 Form ,在服务端根据 __EVENTTARGET __EVENTARGUMENT 来判断是哪个控件的什么事件触发了。
第二章 PostBack 的原理
__doPostBack 是一个纯粹并且是非常简单的 javascript 函数,大部分的页面 PostBack 都是由它触发的。注意,这里是 大部分 ,因为只有两个 Web Server Control    会自己触发页面的 PostBack, 其它的所有控件都是通过 __doPostBack 函数触发页面的 PostBack ,那先来看一下这个函数的定义吧:
CODE1:
< input type="hidden" value="" />
< input type="hidden" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
通过上面的代码可以看到, __doPostBack 带有两个参数, eventTarget 是标识将要引发页面 PostBack 的控件 ID eventArgument 参数提供了在引发页面 PostBack 事件时所带的额外参数。当然这个函数被函数时,这两个参数的值将赋值给页面的两个隐含变量 __EVENTTARGET __EVENTARGUMENT ,然后调用页面的 submit 方法提交页面表单。这就是为什么我们可以通过 Request.Form[“__EVENTTARGET”] 获取得到引发页面 PostBack 的控件 ID 的原因。
了解了 __doPostBack 函数后,我们可以很容易的利用它非常方便地自己触发自定义的 PostBack 事件。那上面也说了,大部分的控件都是调用
第三章 Button PostBack 做法
引了页面的 PostBack ,只有两个控件是例外, Button ImageButton ,正是因为它们不是通过调用 __doPostBack 来回发事件,所以通过表单隐含变量 __EVENTTARGET __EVENTARGUMENT 是无法获取得到引发 PostBack Button ImageButton ID 和参数值的,可通过下面的方式实现
1 )在页面中加如 LinkButton ,页面就会在页面中加载 POSTBACK 所需的 JS
< input type="hidden" value="" />
< input type="hidden" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
2 )利用 GetPostBackEventReference 给客户端生成 __doPostBack()
如:
比如前台页面
< asp:Button id ="Button1" runat ="server" Text ="Button">< / asp:Button >
1
< a href ="#" onclick ="document.getElementById('Button1').click()"> 触发服务器端按钮事件 < / a >
2
利用 GetPostBackEventReference 给客户端生成 __doPostBack()
前台
< a href ="#" onclick ="< %=PostBack()%>"> 触发服务器端按钮事件 < / a >
后台
protected string PostBack()
         {
            
return this.Page.GetPostBackEventReference(this.Button1,"haha");
         }
通过 __EVENTARGUMENT="haha" 可以判断是不是点了那个链接的 PostBack Button1 的按钮事件这么写:
if (Request["__EVENTARGUMENT" ]=="haha")
             {
                 Response.Write("
这个是链接的 PostBack");
             }
            
else
             {
                 Response.Write("
这个不是链接的 PostBack");
             }

转载于:https://www.cnblogs.com/mingh/archive/2010/01/19/1651573.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt中,可以使用QUdpSocket类来实现UDP客户端接收服务器端数据。首先创建一个QUdpSocket对象: QUdpSocket *udpSocket = new QUdpSocket(this); 然后使用bind()函数将该udpSocket绑定到一个本地端口: udpSocket->bind(localPort); 其中localPort是一个本地端口号,用于接收服务器端发送的数据。 接下来,可以使用readyRead()信号和QByteArray类来接收数据。readyRead()信号在有数据到达时触发,我们可以使用信号槽机制连接它: connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams())); 接收数据的具体实现可以在processPendingDatagrams()槽函数中完成: void MyClass::processPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(), datagram.size()); // 处理接收到的数据 } } 在该槽函数中,我们利用hasPendingDatagrams()函数判断是否有待处理的数据包,如果有,就使用readDatagram()函数读取数据包的内容。 最后,可以在处理接收到的数据的部分添加逻辑来完成对接收到的数据的处理。 以上就是在Qt中实现UDP客户端接收服务器端数据的方法。 ### 回答2: QT是一种开发工具,UDP是一种网络通信协议,客户端指的是对UDP服务器进行请求并接收数据的一方,服务器端是负责接收请求并提供数据的一方。 在QT中,开发客户端来接收UDP服务器端的数据可以按照以下步骤进行: 1. 创建一个QT项目,并在项目中添加UDP相关的头文件和库文件。 2. 使用QT提供的QUdpSocket类来创建一个UDP套接字对象。套接字对象是用来进行网络通信的对象。 3. 配置套接字对象的相关参数,如绑定端口号。 4. 使用套接字对象的bind()函数将套接字绑定到特定的主机和端口号上。 5. 使用套接字对象的readyRead()信号和对应的槽函数来接收服务器端的数据。 6. 在槽函数中调用套接字对象的readDatagram()函数来读取接收到的数据,并进行处理。 7. 根据具体需求,可以在接收到数据后对数据进行解析、展示或者其他操作。 8. 可以使用套接字对象的writeDatagram()函数向服务器端发送数据。 9. 在必要的情况下,可以在客户端服务器端的通信过程中使用一些错误处理机制,如超时重发等。 通过以上步骤,就可以在QT中实现UDP客户端接收服务器端的数据。接收到的数据可以根据需求进行处理和展示,以满足具体的业务需求。 ### 回答3: Qt是一个跨平台的C++应用程序开发框架,支持多种网络通信协议,其中包括UDP协议。 在Qt中,可以通过QUdpSocket类来实现UDP客户端。首先,需要创建一个QUdpSocket对象,并通过bind函数绑定本地地址和端口号。然后,可以使用receiveDatagram函数来接收服务器端发送过来的数据。 接收数据的代码示例: ```cpp QUdpSocket *udpSocket = new QUdpSocket(this); udpSocket->bind(QHostAddress::AnyIPv4, 1234); // 绑定本地地址和端口号 QByteArray datagram; // 用于存储接收到的数据 datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress senderAddress; // 存储数据发送者的地址 quint16 senderPort = 0; // 存储数据发送者的端口号 udpSocket->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); // 使用datagram中的数据进行后续处理 delete udpSocket; ``` 在以上代码中,通过udpSocket->bind函数指定了本地地址AnyIPv4和端口号1234,表示接收来自任意地址的UDP数据包。通过udpSocket->readDatagram函数接收数据,并将数据存储在datagram中,同时获取发送者的地址和端口号。 需要注意的是,接收数据的操作是阻塞的,即在调用udpSocket->readDatagram函数时,如果没有接收到数据,程序将一直等待,直到接收到数据或发生错误。 总之,通过以上代码,我们可以在Qt中实现UDP客户端接收服务器端发送的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值