ajax调用其他方法 methods_JavaScript调用后台的三种方法实例(包含两种Ajax)

  • Post author:
  • Post category:java


方法一:直接使用调用(ASPX页面)

前台JS,代码如下:

var methodStr = “”;

alert(methodStr);

后台方法,代码如下:

public static string BehindMethod()

{

return “这是一个后台的方法”;

}

说明:

1)BehindMethod()方法前的public访问修饰符不要忘了;

2)此法有局限性——BehindMethod()只会在ASPX页面加载或者回发的时候自动调用,不能人为控制调用。

方法二:用ajax调用

前台JS/jQuery,代码如下:

var params = {ext:”p9hp”}; //参数,注意参数名要注意和后台方法参数名要一致

$(function(){

$(“#btnOk”).click(function(){

$.ajax({

type:”POST”, //请求方式

url:”AjaxDemo.aspx/GetImg”, //请求路径:页面/方法名字

data: params, //参数

dataType:”text”,

contentType:”application/json; charset=utf-8″,

beforeSend:function(XMLHttpRequest){

$(“#tips”).text(“开始调用后头方法获取图片路径,请等待”);

$(“#imgFood”).attr(“src”,”image/loading.gif”);

},

success:function(msg){ //成功

$(“#imgFood”).attr(“src”,eval(“(“+msg+”)”).d);

$(“#tips”).text(“调用方法结束”);

},

error:function(obj, msg, e){ //异常

alert(“OH,NO”);

}

});

});

});

页面HTML,代码如下:

ASPX后台方法,代码如下:

[System.Web.Services.WebMethod]

public static string GetImg(string ext)

{

System.Threading.Thread.Sleep(5000);//为了有点等待的效果,延迟5秒

StringComparer sc = StringComparer.OrdinalIgnoreCase;

string[] extArr = new string[] { “php”, “asp”, “aspx”, “txt”, “bmp” };

bool f = extArr.Any(s=>sc.Equals(s,ext)); //判断传入的后缀名是否存在

if (f)

{

return “image/54222860.jpg”;

}

return “image/star1.jpg”;

}

说明:

1)后台方法前的[System.Web.Services.WebMethod]不能少;

2)还有一种形式的ajax,与上述很类似,不同之处在于:使用.ashx一般处理程序,将上述前台JS/jQuery代码中url更改为请求的一般处理程序路径/[地址栏参数](地址栏参数根据实际需要决定是否添加),如url:”AjaxDemo.ashx”。然后在AjaxDemo.ashx.cs的public void ProcessRequest(HttpContext context){…}中编写相关代码,最后以context.Response.Write(“返回值”)的形式返回返回值。

方法三:AjaxPro或者Ajax库(也是ajax)

第一步:下载AjaxPro.dll(或者Ajax.dll),并且添加引用到项目

第二步:修改Web.config,在 节点下添加以下代码。这里的Ajax.dll和Ajaxpro.dll引用方法是不一样的,一定要注意。

如果是IIS7,则需要在里加上

第三步:对AjaxPro用到的页(如AjaxDemo.aspx)Page_Load事件中进行运行时注册。如:

protected void Page_Load(object sender, EventArgs e)

{

Ajax.Utility.RegisterTypeForAjax(typeof(AjaxDemo));//是Ajax.dll的

AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxDemo));//Ajaxpro.dll的

}

对RegisterTypeForAjax方法的调用在页面产生如下的javascript代码(另外一种选择,你也可以人工在页面上添加如下的javascript代码):

上面这段代码的粗体部分NAMESPACE.PAGECLASS,ASSEMBLYNAME含义如下

NAMESPACE.CLASS

命名空间和类

ASSEMBLYNAME

程序集的名称

Ajax也可以支持自定义类,但是需要这个类是可以被序列化的,即要在自定义类如User前加上[Serializable()]

[Serializable()]public class User

{

private int _userId;

private string _firstName;

private string _lastName;

public int userId

{

get { return _userId; }

}

public string FirstName

{

get { return _firstName; }

}

public string LastName

{

get { return _lastName; }

}

public User(int _userId, string _firstName, string _lastName)

{

this._userId = _userId;

this._firstName = _firstName;

this._lastName = _lastName;

}

public User(){}

[Ajax.AjaxMethod()]或者是[AjaxPro.AjaxMethod()]

public User GetUser(int userId)

{

//Replace this with a DB hit or something 🙂

return new User(userId,”Michael”, “Schwarz”);

}

[Ajax.AjaxMethod()]或者是[AjaxPro.AjaxMethod()]

public DataSet GetUserList(paramType1 param1, paramType2 param2, …)

{

//Replace this with a DB hit or something 🙂

return a DataSet;

}

[Ajax.AjaxMethod()]或者是[AjaxPro.AjaxMethod()]

public DataTable GetUserList(paramType1 param1, paramType2 param2, …)

{

//Replace this with a DB hit or something 🙂

return a DataTable;

}

}

那么,在调用页面用RegisterTypeForAjax向服务器注册代理类的代码也要相应变更,代理类的名字不再是页面类,而是我们自定义的类,代码如下:

protected void Page_Load(object sender, EventArgs e)

{

Ajax.Utility.RegisterTypeForAjax(typeof(User));//是Ajax.dll的

AjaxPro.Utility.RegisterTypeForAjax(typeof(User));//Ajaxpro.dll的

}

第四步:编写服务端方法,并且用[Ajax.AjaxMethod]标注

注意:

1)方法要写成public,否则在JS里调用的时候会提示”不支持此属性或方法”;

2)在服务端函数,如果需要处理Session信息,此时必须在想支持Session的服务端函数的Ajax.AjaxMethod属性上传递一个参数,如[Ajax.AjaxMethod(HttpSessionStateRequirement.Read)]。当然了,还可以是Write或ReadWrite,这个参数我们可以根据实际需求自行选择。

在下面这个例子中,我们有一个文档管理系统,当一个用户对文档进行编辑的时候会给这个文档加锁,其他用户需要等到这个文档可用时才能修改。不使用Ajax,用户需要不断等待刷新,因为不得不不断的去检查文档的状态是否为可用,这当然不是一个很好的方案。用ajax的sessionstate支持,这就比较容易了。

我们首先Document类中写一个函数,这个函数通过遍历文档ID找到用户需要的文档,存储到session里,并返回没有占用的文档:

[Ajax.AjaxMethod(HttpSessionStateRequirement.Read)]

public ArrayList DocumentReleased()

{

if (HttpContext.Current.Session[“DocumentsWaiting”] == null)

{

return null;

}

ArrayList readyDocuments = new ArrayList();

int[] documents = (int[])HttpContext.Current.Session[“DocumentsWaiting”];

for (int i = 0; i < documents.Length; ++i)

{

Document document =Document.GetDocumentById(documents[i]);

if (document != null && document.Status == DocumentStatus.Ready)

{

readyDocuments.Add(document);

}

}

return readyDocuments;

}

我们在属性参数中指明了HttpSessionStateRequirement.Read,下面写javascript函数来使用这个方法带来的结果:

function DocumentsReady_CallBack(response)

{

if (response.error != null)

{

alert(response.error);

return;

}

if (response.value != null && response.value.length > 0)

{

var div = document.getElementById(“status”);

div.innerHTML = “The following documents are ready!

“;

for (var i = 0; i < response.value.length; ++i)

{

div.innerHTML += ”

” + response.value[i].Name + ”


“;

}

}

}

页面加载后每10秒钟向服务器函数请求一次。如果有返回,则callback函数检查response,并把最新的结果显示出来。

第五步:前台JS,调用User类的GetUser函数。Ajax封装类会创建一个javascript函数,形式与服务端GetUser函数相似,带一个参数,我们以”类名.函数名”的方式调用(如果是AjaxPor.dll,则以”命名空间.类名.函数名”的方式调用)。

作为Ajax最基本的功能,我们所需要做的只是调用这个方法并且传递参数,然后获取返回值进行后续处理,代码如下:

var response = User.GetUser(168);

alert(response.value);

Ajax还有更强大的功能,这就是为什么所有的客户端代理(如User.GetUser)同时带有一个额外的定制属性。这个属性用来处理服务器响应的回调函数:

function getUser(userId)

{

User.GetUser(userId, GetUser_CallBack);

}

function GetUser_CallBack(response)

{

if (response != null && response.value != null)

{

var user = response.value;

if (typeof(user) == “object”)

{

alert(user.FirstName + ” ” +user.LastName);

}

}

}

getUser(1);

从上面的代码中可以看出,我们为GetUser函数增加了一个额外参数GetUser_CallBack,这个参数就是用来处理服务器端响应的客户端函数。这个CallBack函数接受一个带有四个关键属性的response对象:

value

服务器端函数执行的返回值(可能是一个字符串、自定义对象或者dataset)

error

如果发生错误,则返回错误信息.

request

原始的xmlHttpRequest请求

context

一个上下文对象

我们首先应该检查是否有错误发生,你可以通过在服务器端函数抛出异常来实现这个error属性。在上面这个例子中,我们简单的alert了一个值,就是value属性;request属性可以用来取得额外的信息(更多的关于XmlHttpRequest的知识)。

说明:

返回值同服务器端对象一样有三个属性(FirstName, LastName and UserId)。

实例中我们在服务端函数返回了一个User类对象,那么Ajax还支持哪些返回类型呢?

Ajax可以支持除了我们上面GetUser函数返回的User类类型以外的很多类型。它可以直接支持integer, string, double, boolean, DateTime, DataSet 和 DataTable,也支持简单的自定义类型和数组。其他的类型通过其ToString方式来返回字符串。

返回DataSet就像真正的.net Dataset。假设页面中有个id为userinfo的table标签,我们可以通过下面的方法在客户端显示:

function getUserList(userId)

{

User.GetUserList(param1, param2, …, GetUserList_CallBack);

}

function GetUserList_CallBack(response)

{

var ds = response.value;

if (ds != null && typeof(ds) == “object” && ds.Tables != null)

{

$(“#userinfo”).empty();

var rowsLength = ds.Tables[0].Rows.length;

if(rowsLength > 0)

{

for(var i = 0; i < rowsLength; i++)

{

var UserRow = ds.Tables[0].Rows[i];

$(“#userinfo”).append(‘

‘);

$(“#userinfo”).append(‘

‘ + UserRow.UserId + ”);

$(“#userinfo”).append(‘

‘ + UserRow.FirstName + ”);

$(“#userinfo”).append(‘

‘ + UserRow.LastName + ”);

$(“#userinfo”).append(‘

‘);

}

}

else

{

$(“#userinfo”).append(‘

No data has been found!’);

}

}

else

{

alert(“Error:” +response.request.responseText);

}

}

返回Unicode字符

Ajax.net可以从服务器端向客户端返回Unicode字符,为了做到这一点,在服务端函数返回时返回的值必须是Html编码的:

[Ajax.AjaxMethod()]

public string Test1(string name, string email, string comment)

{

string html = “”;

html += “Hello ” + name + ”

“;

html += “Thank you for your comment

“;

html +=System.Web.HttpUtility.HtmlEncode(comment);

html += “.”;

return html;

}

代理的工作机制:

Ajax.PageHandlerFactory是通过反射来取得有定制属性的函数的细节。Handler寻找带有AjaxMethod定制属性的函数,取得他们的特征(返回类型、名称、参数)并依据这些信息创建客户端代理。特别的,ajax创建一个与服务端函数类型相同的JavaScript对象作为代理。

Ajax技术可以给客户端提供丰富的客户体验,而ajax.net为您容易的实现这样强大的功能提供了可能,你可以通过下面的链接查看ajax.net的最新文档:

Keep a close eye on the AJAX .Net wrapper website:http://ajax.schwarz-interactive.de/

For a good hands-on sample, check out the following demo application:http://ajax.schwarz-interactive.de/download/ajaxsample.zip



版权声明:本文为weixin_39693193原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。