随笔-312  评论-11907  文章-2  trackbacks-224

本文来自《ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关》的第三章《异步调用Web Service和页面中的类方法》,请同时参考本章的其他文章
 

3.4 保持用户上下文

“异步”执行意味着原本从头到尾执行的函数被拦腰截断,分成了两个不同的函数。而这两个函数之间的联系往往又非常紧密,例如有些时候我们需要在后一个函数(即回调函数)中访问前一个函数中计算出来的变量,或是在后一个函数中得到前一个函数执行时的上下文等信息。特别地,若是几个不同的异步函数均提供了同一个回调函数进行处理,我们一般还要在回调函数中知道是哪个函数引发的这次回调。为了满足这些需求,程序自然产生了用户上下文的概念。

ASP.NET AJAX异步通讯层所提供的异步调用模型中同样提供了对传递用户上下文信息的支持。我们还使用一个简单的示例程序演示其具体的实现。

程序的功能并不复杂:两个按钮都将异步调用服务器端的同一个Web Service并指定同一个回调函数,取得服务器端当前时间之后显示出来,同时显示出来的还有用户点击了哪个按钮的信息。如图3-7和图3-8所示,注意其中用户上下文的不同。

图3-7点击第一个按钮取得服务器端当前时间

图3-8点击第二个按钮取得服务器端当前时间

Web Service的声明如下,返回当前服务器端时间而已:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class UserContextService : System.Web.Services.WebService
{
 
    [WebMethod]
    public string GetServerDateTime()
    {
        return DateTime.Now.ToString();
    }
 
}

页面中的ScriptManager控件引用了该Web Service,以便生成其客户端调用代理:

<asp:ScriptManager ID="sm" runat="server">
    <Services>
        <asp:ServiceReference Path="Services/UserContextService.asmx" />
    </Services>
</asp:ScriptManager>

界面元素也不复杂:前两个按钮将分别调用上面定义的Web Service;后面的id为result的<div />则用来显示调用结果:

<input id="btnGetServerDateTime1" type="button" value="Get ServerDate Time 1"
    onclick="return btnGetServerDateTime1_onclick()" />
<input id="btnGetServerDateTime2" type="button" value="Get ServerDate Time 2" 
    onclick="return btnGetServerDateTime2_onclick()" />
<div id="result"></div>

两个按钮的click事件的处理函数如下:

function btnGetServerDateTime1_onclick() {
    UserContextService.GetServerDateTime(onSucceeded, onFailed, "Button 1");
}
 
function btnGetServerDateTime2_onclick() {
    UserContextService.GetServerDateTime(onSucceeded, onFailed, "Button 2");
}

注意其中粗体部分——唔,似乎前面刚刚总结出来的客户端调用Web Service代理的语法:[NameSpace].[ClassName].[MethodName](param1, param2 …, onSucceeded, onFailed)又有了新的变化:在成功回调函数和失败回调函数后面又多了一个参数,这正是本示例程序要演示的用户上下文参数,这里我们分别将其设置为“Button 1”和“Button 2”。

这样,客户端调用Web Service代理的语法就变为:

[NameSpace].[ClassName].[MethodName](param1, param2 …, onSucceeded, onFailed, userContext)

相应地,onSucceeded()回调函数的签名也有所变化,在方法返回值参数之后添加了一个代表用户上下文对象的参数。在本示例程序中,我们将这个上下文参数(即“Button 1”和“Button 2”)简单地显示出来,注意代码中的粗体部分:

function onSucceeded(result, context) {
    $get("result").innerHTML = 
        "<strong>Current Server DateTime: </strong>" + result
        + "<br /><strong>User Context: </strong>" + context;
}

这样即完成了本示例程序。需要注意的是,用户上下文不仅仅可以传递字符串,就像在这个示例程序中的一样,还可以传递复杂的JavaScript对象,例如:

var contextObj = {
    Name: "Dflying",
    Age: 88,
    DateOfBirth: new Date()
};
SomeNamespace.SomeClass.SomeMethod(param1, param2, onSucceeded, 
    onFailed, contextObj);

然后在onSucceeded()回调函数中,我们即可访问到传递过来的用户上下文对象:

function onSucceeded(result, context) {
    var name = context.Name;
    var age = context.Age;
    var dateOfBirth = context.DateOfBirth;
}
posted on 2007-06-07 00:41 Dflying Chen 阅读(4543) 评论(37)  编辑 收藏 所属分类: ASP.NET AJAX (Atlas)

评论:
#1楼  2007-06-07 01:16 | 李永京      
非常期待第2卷早日出版。学习:)
  回复  引用  查看    
#2楼  2007-06-07 02:12 | 若寒      
我以为我是沙发!
学习中。。期待第二卷。
:)
  回复  引用  查看    
#3楼  2007-06-07 03:38 | Leepy      
原来是这样,又懂了一些!
  回复  引用  查看    
#4楼  2007-06-07 06:55 | cheap [未注册用户]
我不懂把这些没啥技术含量的东西发出来为了什么?
感觉你对ajax.net的异步很新鲜哦,难道你不知ajax中的a是啥意思?
  回复  引用    
#5楼  2007-06-07 07:07 | cheap [未注册用户]
这些东西在官方的doc中一眼就能见。

感觉你就没有啥项目经历
var contextObj = {
Name: "Dflying",
Age: 88,
DateOfBirth: new Date()
};

这个我们把它称做JSON对象,别说复杂的JavaScript对象了,Java的朋友会笑话我们。
把服务端对象Convert成JSON对象,这是在ajax.net中很重要的一个特点。


  回复  引用    
#6楼 [楼主] 2007-06-07 08:07 | Dflying Chen      
@李永京
@若寒
谢谢支持
  回复  引用  查看    
#7楼 [楼主] 2007-06-07 08:07 | Dflying Chen      
@Leepy
:)
  回复  引用  查看    
#8楼 [楼主] 2007-06-07 08:10 | Dflying Chen      
@cheap
谢谢批评,所谓“技术含量”,也是仁者见仁的事情。不过ajax中的a含义,有什么新的“想法”么?愿听教诲
  回复  引用  查看    
#9楼 [楼主] 2007-06-07 08:13 | Dflying Chen      
@cheap
我所指的“复杂”JavaScript对象指的是除了Number、Array之类基本类型的“复杂”对象。
为了演示,这里不能也没有必要给出一个真正意义上的“复杂”对象,读者理解就好。
“把服务端对象Convert成JSON对象”,确实是ASP.NET AJAX中的一个重要特性,如果你看过这个系列的目录的话,将会看到很大的篇幅都将介绍这些内容。

谢谢指教,欢迎继续讨论
  回复  引用  查看    
#10楼  2007-06-07 09:42 | Qingzhou [未注册用户]
感觉不错,通俗易懂,继续支持一下
  回复  引用    
#11楼  2007-06-07 09:44 | yao [未注册用户]
看了第三章前几节的内容,觉得讲得很通俗易懂.谢谢您的慷慨.
很期待以后几节的内容. 更期待此书的出版.
  回复  引用    
#12楼 [楼主] 2007-06-07 10:01 | Dflying Chen      
@Qingzhou
@yao
谢谢支持,继续努力:)
  回复  引用  查看    
#13楼  2007-06-07 10:28 | .Live      
看到cheap的留言,忍不住要说两句
作者出本技术书,都是有针对的读者群的,比如有针对初学者,还有专门给高手进阶用的书,这时候在用语方面当然是不一样的,如果你觉的文章说的东西太简单,那你已经是个高手了,就可以不看这篇文章,如果你觉的文章里哪些说法或者概念有错误,你可以直接指出来,我想作者也能虚心接受,或者进行讨论的。

你说些 “这个我们把它称做JSON对象,别说复杂的JavaScript对象了,Java的朋友会笑话我们。”“我不懂把这些没啥技术含量的东西发出来为了什么?” 等等的话 不知道有什么意义,javascript我是不太了解,我是不太清楚json这个概念是什么时候提出的,而javascript是什么时候出来的?如果javascript比json这个概念出的早,不知道像作者这样定义的对象,你们称它叫做什么?

对楼主要说声抱歉,在你的地盘上 说了些气话。。就这么一次,不会再有了,不好意思了。


  回复  引用  查看    
#14楼 [楼主] 2007-06-07 10:37 | Dflying Chen      
@.Live
心平气和最好,我想cheap兄也没有恶意,最多只是“恨铁不成钢”吧。其实也难怪他这样评价,因为这篇文章确实相对来说比较基础和入门——深入的文章我还没来得及放上来么:)

感谢你的支持,同样也感谢cheap兄对我的批评!希望通过这样的讨论,让大家都能够受益!
  回复  引用  查看    
#15楼  2007-06-07 10:39 | ╃小〥斌╄      
JSON格式 是根据自己需要定制的 , 其实就是后台把服务器端数据组装成一个便于前台通过eval 生成一个js对象的字符串。 方便前台调用。

期待楼主的“把服务端对象Convert成JSON对象”, 以前自己也写了一套 ,回头整理下。




  回复  引用  查看    
#16楼 [楼主] 2007-06-07 11:13 | Dflying Chen      
@╃小〥斌╄
将在这两天放出:)
  回复  引用  查看    
#17楼  2007-06-07 11:53 | wd900      
网上从来不缺少象cheap这样自以为是的二百五,楼主不必介意.
  回复  引用  查看    
#18楼  2007-06-07 12:15 | JerryChou      
看了第一卷,收获良多,看书的过程中没有一处阻碍,所有内容循序渐进,一气呵成,不像很多别的书或文章一样,让人看得云里雾里,期待楼主的第二卷早日面市。
  回复  引用  查看    
#19楼 [楼主] 2007-06-07 12:20 | Dflying Chen      
@wd900
也不能这么说,cheap兄的意见还是很有价值的,这篇文章内容确实比较基础。
  回复  引用  查看    
#20楼 [楼主] 2007-06-07 12:20 | Dflying Chen      
@JerryChou
谢谢鼓励,我会继续努力的!
  回复  引用  查看    
#21楼  2007-06-07 15:04 | Anthan      
通俗易懂,喜欢这种风格
中国人写书就喜欢写的让人看不懂,好像别人越看不懂就越能显示自己的水平
其实写东西的目的无非是想让别人理解你的思想。
像这篇文章这样简单一点多好。
  回复  引用  查看    
#22楼  2007-06-07 18:20 | 木野狐      
写的很好。文章的排版和风格也无可挑剔。
  回复  引用  查看    
#23楼 [楼主] 2007-06-07 21:05 | Dflying Chen      
@Anthan
谢谢,难的会慢慢来的
  回复  引用  查看    
#24楼 [楼主] 2007-06-07 21:09 | Dflying Chen      
@木野狐
谢谢
  回复  引用  查看    
#25楼  2007-06-07 23:03 | 乐趣电子书 [未注册用户]
可惜不是很懂 害
  回复  引用    
#26楼  2007-06-08 03:10 | QQ大侠 [未注册用户]
现在还没有用到ajax,可惜~
  回复  引用    
#27楼  2007-06-12 16:13 | Clingingboy      
写的很好,示例代码就该简单,通熟易懂.希望不要有人在这里老在吹java,贬低.net.有什么问题大家可以讨论.难道真的以为这里没人知道json吗?
  回复  引用  查看    
#28楼 [楼主] 2007-06-12 19:43 | Dflying Chen      
@Clingingboy
谢谢支持,我也是这么想的:)
  回复  引用  查看    
#29楼 [楼主] 2007-06-12 19:43 | Dflying Chen      
@QQ大侠
@乐趣电子书
都是广告?
  回复  引用  查看    
#30楼  2007-07-10 13:01 | rdjiang [未注册用户]
我已经是个老程序员了,不过对楼主是发自内心的尊敬--技术、责任心和道德水准。
  回复  引用    
#31楼 [楼主] 2007-07-10 13:35 | Dflying Chen      
@rdjiang
:)过奖了,不敢当
  回复  引用  查看    
#32楼  2007-07-10 15:10 | Anthan      
问个实际中的问题噢
如果我在JavaScript调用页面后台代码中的公有静态方法,那我在这个方法中就不能使用页面中的控件了对吧?
那我如果要操纵一个复杂控件,比如DataGrid的话只能在客户端自己构造HTML代码显示了?
  回复  引用  查看    
#33楼  2007-07-10 17:58 | winnerzone      
写的不错!谢谢.
  回复  引用  查看    
#34楼 [楼主] 2007-07-10 18:59 | Dflying Chen      
@Anthan
恩,基本上就是这样的。
  回复  引用  查看    
#35楼 [楼主] 2007-07-10 18:59 | Dflying Chen      
@winnerzone
谢谢支持!
  回复  引用  查看    
#36楼  2007-08-16 17:19 | TSENG      
题目是:使用ASP.NET AJAX异步调用Web Service和页面中的类方法。
例子只给出了调用WS;请问,如何调用页面中的类方法呢?是否给个例子,谢谢。
  回复  引用  查看    
#37楼  2008-01-16 16:49 | matx_he [未注册用户]
我看过你的书,看得不错!

在实际工作中,遇到一个问题:如何把服务器端的类序列化成JSON放到客户端,我看过ajax.net 生成的代码,好像有这些公共方法,应该怎么解决比较好? 谢谢!
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: