学习笔记(1)在 ASP.NET 网页中不经过回发而实现客户端回调

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

根据Visual Studio的例子:客户端回调实现 (C#) 示例 ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/2c688b1a-93a4-4dad-b82b-63974bdbb13e.htm

HTML代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ClientCallbackSample.aspx.cs" Inherits="ClientCallbackSample" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 
  1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>演示在 ASP.NET 网页中不经过回发而实现客户端回调</title>
  
<script type="text/javascript">
    
function LookUpStock()
    
{
        
var lb = window.document.getElementById("ListBox1");
        
        
if(lb.selectedIndex != -1)
        
{
            
var product = lb.options[lb.selectedIndex].text;
            CallServer(product, 
"");
        }

        
else
        
{
            alert(
"请从上面列表中选择一项产品!");
        }

        
    }

    
    
function ReceiveServerData(rValue)
    
{
        Results.innerText 
= rValue;
    }

    
  
</script>
</head>
<body>
  
<form id="form1" runat="server">
    
<div>
      
<asp:ListBox ID="ListBox1" Runat="server"></asp:ListBox>
      
<br />
      
<br />
      
<button onclick="LookUpStock()">Look Up Stock</button>
      
<br />
      
<br />
      Items in stock: 
<span id="Results"></span>
      
<br />
      
<br />
      
<br />
    
</div>
        
</form>
</body>
</html>

 

后台CS

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class ClientCallbackSample : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    
protected System.Collections.Specialized.ListDictionary catalog;
    
protected void Page_Load(object sender, EventArgs e)
    
{
        String cbReference 
= Page.ClientScript.GetCallbackEventReference(this"arg""ReceiveServerData""context");
        String callbackScript;
        callbackScript 
= "function CallServer(arg, context)" +
            
"" + cbReference + "} ;";
        Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
            
"CallServer", callbackScript, true);

        
//if (!IsPostBack)
        
//{
        
//    Label label = new Label();
        
//    label.Text = "中华人民共和国!";
        
//    form1.Controls.Add(label);
        
//}

        catalog 
= new System.Collections.Specialized.ListDictionary();
        catalog.Add(
"monitor"12);
        catalog.Add(
"laptop"10);
        catalog.Add(
"keyboard"23);
        catalog.Add(
"mouse"17);

        ListBox1.DataSource 
= catalog;
        ListBox1.DataTextField 
= "key";
        ListBox1.DataBind();
    }


    
private string _returnValue;
    
public void RaiseCallbackEvent(String eventArgument)
    
{
        String returnValue;
        
if (catalog[eventArgument] == null)
        
{
            returnValue 
= "-1";
        }

        
else
        
{
            returnValue 
= catalog[eventArgument].ToString();
        }

        _returnValue 
= returnValue;
    }


    
ICallbackEventHandler 成员
}

测试后存在以下问题

  • HTML的LookUpStock函数中的var lb=document.form1[0].ListBox1出错,改为var lb=window.document.getElementById("ListBox1"]才通过,原因常未弄清楚。
  • 按帮助中源代码调试,在不选择ListBox项就点击Look Up Stock按钮时的JS错误是因为默认情况下,ListBox的selectedIndex为-1,现加入一个判断,当用户还未选择 时点击,给一个提示信息
  • 例子中后台CS代码实现了ICallBackEnevtHandler接口,但是存在两个问题是:该接口必须实现的两个方法第一是public void RaiseCallbackEvent(String eventArgument), 注意是void;第二是public string GetCallbackResult()而例子很奇怪,RaiseCallbackEvent本是void的,他它却是返回string,并且例子中也没有实现GetCallbackResult方法, 难道是Microsoft搞错了...., 导致在调试时报错,解决办法,将RaiseCallbackEvent方法改为void类型,并加入了一个全局的成员变量来将客户端传递的字符串eventArgument纪录, 并由GetCallBackResult返回 。
  • ClientScript.GetCallbackEventReference方法的context参数还未明白具体的作用是什么。

在完成以上工作以后,我发现每次点击Look Up stock按钮时,程序仍然都会从PageLoad开始执行,我在想这样和Asp.net正常的回发有什么区别呢?难道就只是欺骗了眼睛,页面看起只是局部刷新而已?于是我 写了一小段代码来测试,在页面第一次加载时(也就是!IsPostback)动态创建了一个Label,给Label的Text指定一个值,在页面回发时不重新创建这个Label,在正常情况下,当产生PostBack时,这个Label肯定是 会不见的,但在这个例子中,动态创建的Label在我点击一次,甚至N次按钮之后,依然好好的显示在浏览器上,得出的结论应该是通种方式实现客户端回调,没有丢失客户端状态,所以这种方式的好处就是 帮助中第一段落:

在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本 的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而不执行回发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外, 页回发会导致处理开销,这会降低性能,且会让用户不得不等待处理并重新创建页。若要避免丢失客户端状态并且不导致服务器往返的处理开销,可以对 ASP.NET 网页编码,使其能执行客户端回调。在客户端回调中, 客户端脚本函数会向 ASP.NET 网页发送一个请求。该网页运行其正常生命周期的修改版本 — 初始化页并创建其控件和其他成员,然后调用特别标记的方法。该方法执行代码中编写的处理过程,然后向浏览器返回可 由另一客户端脚本函数读取的值。在此过程中,该页一直驻留在浏览器中。

asp.net html按钮事件,js触发asp.net的Button的Onclick事件应用 asp.net引入事件驱动之后,在一个页面上很容易解决多个按钮触发同事件的问题,避免了在asp中需要多个form或者通过js脚本来控制的麻烦。asp.net带来便利的同时,也带来一个问题。在实际应用中一个页面存在多个按钮的情况并多。用户习惯于在输入框输入内容之后,直接按车就提交表单了。由于asp.net采用的是事件驱动模式,所以默认用户按车并没有触发按钮的onclick事件。用户按车也... 阅读详情

相关推荐

ASP.NET 网页经过回发而实现客户端回调

一、使用回调函数的好处ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而执行发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页发会导致处理开销,这会...

baibu1683的博客 189

ASP.NET 网页经过回发而实现客户端回调

        由于也是初学者,还知道它和当前ajax之间有什么联系,个人感觉用这种方法就可以实现异步刷新页面了,那为什么还要用到ajax技术了呢?难道客户端回调只属于.net下面特有的,而ajax是无平台区分的么?下面是我对.net回调一些理解,难免有些肤浅,希望大家指正。1.首先要对页面实现ICallbackEventHandler 接口,这主要是让控件可以作为服务器回调事件的目标

attribute的专栏 528

ASP.NET 网页经过回发而实现客户端回调

ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而执行发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页发会导致处理开销,这会降低性能,且会让用户等待处理并

johncools的博客 1028

如何在 ASP.NET 网页实现回调

如何:在 ASP.NET 网页实现回调 在客户端回调中,客户端脚本函数会向 ASP.NET 网页发送请求,该网页随后会运行其正常生命周期的简化版本以处理该回调。若要确保回调事件源于预期的用户界面 (UI),可以对回调进行验证。在回调验证中,应先在网页呈现过程中注册要验证的事件,然后在回调过程中对该事件进行验证。有关回调的概述,请参见<a id="ctl00_mainConte

我的IT世界 950

如何:在 ASP.NET 网页实现回调

如何:在 ASP.NET 网页实现回调 在客户端回调中,客户端脚本函数会向 ASP.NET 网页发送请求,该网页随后会运行其正常生命周期的简化版本以处理该回调。若要确保回调事件源于预期的用户界面 (UI),可以对回调进行验证。在回调验证中,应先在网页呈现过程中注册要验证的事件,然后在回调过程中对该事件进行验证。有关回调的概述,请参见<a id="ctl00_mainConte

我的IT世界 559

ASP.NET 客户端回调实现 (C#) 示例

ASP.NET  客户端回调实现 (C#) 示例   演示实现客户端回调ASP.NET 网页。有关更多信息,请参见在 ASP.NET 网页经过回发而实现客户端回调。示例说明下面的代码示例分为两部分。示例的第一部分演示一个 ASP.NET 网页.aspx 页)。第二部分演示相应的代码隐藏文件(.aspx.cs 文件)。C#

北菜园巷5号(北京菜农) 1109

ASP.NET 网页经过回发而实现客户端回调(附Gridview无刷新代码)

嗨!~。大家好,今天又想发点东西。好大家要见怪。只应小弟水平有限拉。,今天主要对ASP.NET 网页经过回发而实现客户端回调进行了一番研究。    其中附件代码是我从网上下载,进行研究理解以后,修改成的结果(大家看到可能比较眼熟吧!其实网络的意义本来就是供大家共享的,当时是刚刚同学提醒我的。开个玩笑。)。套入正题!!!     在 ASP.NET 网页的默认模型中,用户会与页交

老卡的专栏 1995

客户端回调服务器端事件

<br />在 ASP.NET 网页的默认模型中,单击按钮或执行导致发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,然后返浏览器,并呈现出来。但是,在有些情况下,需要从客户端运行服务器代码,而执行发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页发会导致处理开销,这会降低性能,且会让用户等待处理并重新创建页。<br />若要避免丢失客户端状态并且导致服务器往返的处理开销,可以对 ASP.NET 网页编码,使

a282421083的专栏 3010

ASP.NET实现回调实现的步骤

ASP.NET 网页的默认模型中,单击按钮或执行一些其他操作会导致发,此时将重新创建页及其控件,并在上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行代码,而执行发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页发会导致处理开销,这会降低性能,且会让用户等待处理并重新创建页。mjiqw.co

dunshu785的专栏 1294

ASP.NET 网页经过回发而实现客户端回调 [转MSDN]

ASP.NET 网页经过回发而实现客户端回调  在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而执行发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页

High_Mount的专栏 1066

ASP.NET实现回调

ASP.NET实现回调 一、引言 在ASp.NET网页的默认模型中,用户通过单击按钮或其他操作的方式来提交页面,此时客户端将当前页面表单中的所有数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器将重新实例化一个当前页面类的实例来响应这个请求,然后将整个页面的内容重新发送到客户端。这种处理方式对运行结果没什么影响,但页发会导致处理开销,从...

fgmah2000的博客 227

ASP.NET 网页经过回发而以编程方式实现客户端回调

MSDN:在 ASP.NET 网页经过回发而以编程方式实现客户端回调 在期望执行回发而客户端运行服务器代码的情况下,可以使用 ClientScriptManager 类来调用客户端回调。这称为对服务器执行带外回调。在客户端回调中,客户端脚本函数向 ASP.NET 网页发送异步请求。网页修改其正常生命周期来处理回调。使用 GetCallbackEventReference 方法...

bajiu8387的博客 157

客户端回调实现 (C#) 示例

演示实现客户端回调ASP.NET 网页。有关更多信息,请参见<a id="ctl00_mainContentContainer_ctl01" onclick="function onclick(){Track(ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl01,this);}" href="http

我的IT世界 736
上一篇: 维护Panel的滚动条ScrollBars位置(C#)
下一篇: AJAX in Action学习笔记:一、AJAX的四个基本原则
llxchen
博客等级 码龄24年 61粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值