手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

使用ASP.NET AJAX框架扩展HTML Map控件

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  下面,我们来看如何创建一个定制的客户端类。

  四、 创建客户端定制类

  我们知道ASP.NET AJAX框架的重大“发明”之一就是,它引入了面向对象的JavaScript编程模型。现在,借助于JavaScript设计模式,我们可以轻松地创建自己的模板或类,加入继承概念,创建接口与枚举等。

  在本文中,我们将开发一个封装所有本示例中要求功能的客户端类。

  现在,右击工程,并新添加一个名为ImageMap的JavaScript文件。在此文件中,我们将定义一个新的命名空间MyServices;这个命名空间将包含我们要开发的客户端类。如下所示:

以下是引用片段:
Type.registerNamespace("MyServices");


  接下来,我们定义要创建的客户端类的构造函数:

以下是引用片段:

MyServices.Location = function (uiElement, uiBody) {
MyServices.Location.initializeBase(this);
this._uiElement = uiElement;
this._uiBody = uiBody;
this._xAxis = 0;
this._yAxis = 0;
}


  一个模板或类的构造函数也只不过是一个普通的JavaScript函数。该构造器共有两个参数:uiElement和uiBody。

  这两个参数都将用于描述在页面显示的弹出窗口。另外两个私有变量_xAxis和_yAxis用于描述弹出窗口的显示位置。典型情况下,我们最好在构造器中声明所有的私有成员。

  接下来,我们将使用原型设计模式编写该类中的成员函数和属性:

以下是引用片段:

MyServices.Location.prototype =
{
get_uiElement: function()
{
return this._uiElement;
},
set_uiElement: function(value)
{
this._uiElement = value;
},
get_uiBody: function()
{
return this._uiBody;
},
set_uiBody: function(value)
{
this._uiBody = value;
},


  注意,这里的UI元素属性方法的定义方式非常类似于.NET中各种语言中的定义形式。

  下面的成员函数是我们的重点,它负责调用远程的Web服务:

以下是引用片段:
  ShowPopupinfo: function(event, areaName)
{
MyServices.LocationService.GetAreaInfo(areaName,
Function.createDelegate(this, this.OnCompleted),
this.OnError, //负责进行错误处理的回叫函数
this.OnTimeOut); //负责进行超时处理的回叫函数
this._xAxis = event.clientX;
this._yAxis = event.clientY;
}


  上面的代码展示的是非常典型的从客户端调用Web服务的方法:

  1)形式与调用一个普通的本地方法几乎一样方便;

  2)Function.createDelegate函数是ASP.NET AJAX客户端开发中的极为重要的全局函数。创建此函数的原始目的之一是解决this关键字的问题。在一个由一个DOM元素引发的事件处理器中,this关键字总是引用此DOM元素而不是类本身。但在此,我们使用这个函数的理由是,使得AJAX环境在与激发Web服务的相同的类实例中调用成功时的回叫函数。当你需要引用客户端类的属性和方法时,这是相当重要的。简言之,使用此函数将使得访问调用Web服务的客户端类的属性和方法安全而准确。否则,进行异步调用的客户端类实例将为null,因为Web服务的响应是在另一个不同的上下文中执行的—这个上下文不再等同于发出异步Web调用请求的那个上下文。

  3)有意思的是,这里的GetAreaInfo方法并不是我们在前面创建的Web服务中的那个,而是属于在运行时刻创建的Web服务代理类—此代理类作为一个客户端代理访问服务器端的ASMX Web服务。

  上面ShowPopupInfo函数中的最后两行代码中,使用事件的输入参数设置两个私有变量xAxis和yAxis的值。我们在此的目的是,在与用户点击位置尽可能近的地方显示弹出窗口。

  下面是调用成功时对应的回叫函数的实现代码:

以下是引用片段:

OnCompleted: function(result, userContext, methodName)
{
var uiElement = $get(this.get_uiElement());
var uiBody = $get(this.get_uiBody());
if (uiBody != null)
{
var textNode = uiBody.firstChild;
if (!textNode)
{
textNode = document.createTextNode(result);
uiBody.appendChild(textNode);
}
else
{
textNode.nodeValue = result;
}
if (uiElement != null)
{
uiElement.style.visibility = "visible";
uiElement.style.display = "inline";
uiElement.style.left = this._xAxis "px";
uiElement.style.top = this._yAxis "px";
}
}
},


  内容相当简单—把从服务器端返回的数据设置为弹出窗口的显示内容并根据情况确保显示此窗口。

  在创建客户端类的最后,我们还必须告诉AJAX框架在客户端注册之,以便可以从客户端访问它:

以下是引用片段:
MyServices.Location.registerClass("MyServices.Location");


  至此,客户端类MyServices.Location已经成功创建。那么,如何使用它呢?

  首先,我们需要在页面加载时定义客户端类的一个新的实例。为此,我们需要在pageLoad函数中编程:

以下是引用片段:
 var location = null;
  function pageLoad(sender, args) {
  location = new MyServices.Location("modal", "modalBody");
  location.HidePopupInfo();
  }


  上面的代码简单地创建MyServices.Location类的一个新的实例。然后调用客户端类的成员函数之一来隐藏页面中的弹出窗口。为什么我们在pageLoad函数中创建客户端类的一个实例呢?原因在于,当AJAX环境控制流程到达pageLoad函数时,所有的AJAX客户端和用户定义的JavaScript代码都已经被成功加载。因此,这一时刻我们可以安全地访问任何用户或系统定义的JavaScript代码。

  其它几个工具函数比较简单,在此不再赘述。

  五、 总结

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!