博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12. Ext.Ajax 对ajax的支持
阅读量:6001 次
发布时间:2019-06-20

本文共 4736 字,大约阅读时间需要 15 分钟。

转自:http://www.cnblogs.com/lipan/archive/2011/12/09/2272793.html

本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封装,函数事件操作封装,还有扩展的常用函数等。Ajax服务端交互式操作是提交到.NET MVC。后续服务端交互都采用这一方式实现。

一、ExtJs中的Ajax:Ext.Ajax.request

通过客户端向服务端发送Ajax请求,可以“直接”调用MVC的action方法,并传递参数,action返回值可以是普通字符串,也可以是json对象。请求可以添加自定义头信息。看下面例子:

1.异步请求,发送自定义请求头:

html页面如下:

[html]

1
2
3
4
<
h1
>Ajax服务端请求</
h1
>
<
div
class="content" id="div1">
<
div
>一共发起了<
span
id="span1" style="color:Red">0</
span
>次请求。</
div
>
</
div
>

我们先通过一个按钮单击事件触发ajax请求,服务端返回string到客户端,异步请求时,为请求添加自定义头“userHeader”,并在服务端获取。如下是js代码:

[Js]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ext.onReady(
function
() {
    
new
Ext.Button({
        
renderTo:
"div1"
,
        
text:
"后台Ajax提交"
,
        
handler:
function
() {
            
Ext.Ajax.request({
                
url:
'Ajax_Func1'
,
                
headers: {
                    
'userHeader'
:
'userMsg'
                
},
                
params: { a: 10, b: 20 },
                
method:
'GET'
,
                
success:
function
(response, options) {
                    
Ext.MessageBox.alert(
'成功'
,
'从服务端获取结果: '
+ response.responseText);
                
},
                
failure:
function
(response, options) {
                    
Ext.MessageBox.alert(
'失败'
,
'请求超时或网络故障,错误编号:'
+ response.status);
                
}
            
});
        
},
        
id:
"bt1"
    
});
 
});

 

服务端MVC接受请求的action代码:

[C#]

1
2
3
4
5
public
ContentResult Ajax_Func1(
int
a,
int
b)
{
    
string
userHeaderMsg = Convert.ToString(Request.Headers[
"userHeader"
]);
    
return
Content((a + b).ToString() +
",userHeader:"
+ userHeaderMsg);
}

然后我们在火狐中调试:自定义请求头已被添加。

查看执行结果:

2.异步请求,返回json:

如果要返回json到客户端,MVC需要使用JsonResult的acton,自动将C#对象转换为json格式。客户端代码如下:

[Js]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Ext.onReady(
function
() {
 
    
new
Ext.Button({
        
renderTo:
"div1"
,
        
text:
"后台Ajax提交方式2返回JSON"
,
        
handler:
function
() {
            
Ext.Ajax.request({
                
url:
'Ajax_Func2'
,
                
params: { n: 10 },
                
method:
'POST'
,
                
callback:
function
(options, success, response) {
                    
if
(success) {
                        
var
responseJson = Ext.JSON.decode(response.responseText);
 
                        
Ext.Msg.alert(
"成功"
, options.params.n +
"的阶乘是:<font color='red'>"
+ responseJson.n1 +
"</font><br />"
                      + options.params.n +
"的累加是:<font color='red'>"
+ responseJson.n2 +
"</font>"
);
                    
}
else
{
                        
Ext.Msg.confirm(
'失败'
,
                                            
'请求超时或网络故障,错误编号:['
+ response.status +
']是否要重新发送?'
,
function
(btn) {
                                                
if
(btn ==
'yes'
) {
                                                    
Ext.Ajax.request(options);
                                                
}
                                            
});
                    
}
                
}
            
});
        
}
    
});
 
});

服务端代码:

[C#]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public
JsonResult Ajax_Func2(
int
n)
{
    
int
n1 = 1;
    
int
n2 = 0;
    
for
(
int
i = 1; i <= n; i++)
    
{
        
n1 *= i;
        
n2 += i;
    
}
 
    
var
data =
new
    
{
        
n1 = n1,
        
n2 = n2
    
};
 
    
return
Json(data, JsonRequestBehavior.AllowGet);
}

查看执行结果,我们先看看火狐调试响应的结果,可以查看返回的json内容:

界面执行结果:

3.异步文件上传

ExtJs通过强大的内部封装,使ajax请求看起来可以直接提交二进制流数据。每当提交文件数据时,ExtJs会自动创建iframe,在iframe中提交。提交完成后又自动移去,一切显得天衣无缝。下面演示一个通过异步请求无刷新文件上传的例子:

[html]

1
2
3
4
5
6
7
<
h1
>Ajax文件上传</
h1
>
<
div
class="content" id="div2">
<
form
id="form1">
请选择文本文件:<
input
type="file" name="file" />
<
input
type="button" id="button1" value="上传" />
</
form
>
</
div
>

[Js]

1
2
3
4
5
6
7
8
9
10
11
//文件上传
Ext.get(
"button1"
).on(
"click"
,
function
() {
    
Ext.Ajax.request({
        
url:
"Ajax_FileUp"
,
        
isUpload:
true
,
        
form:
"form1"
,
        
success:
function
(response) {
            
Ext.MessageBox.alert(
"上传成功,文本文件内容:"
, response.responseText);
        
}
    
});
});

[C#]

1
2
3
4
5
6
public
ContentResult Ajax_FileUp(HttpPostedFileBase file)
{
    
System.IO.StreamReader r =
new
System.IO.StreamReader(file.InputStream, System.Text.UTF8Encoding.Default);
    
var
str = r.ReadToEnd();
    
return
Content(str);
}

提交后我们发现,上传的文本文件内容已经被正确读取。

4.异步请求事件

当发起ajax请求之前,可以监听beforerequest事件,本例每当发起ajax事件时,都会把计算器+1:

[Js]

1
2
3
var
ajaxCount = 0;
//每当Ajax请求发起时触发:
Ext.Ajax.on(
'beforerequest'
,
function
() { Ext.get(
"span1"
).update(++ajaxCount) },
this
);

这样,每当ajax发起就可以被记录,可用作日志等。

二、元素对象Ajax式更新:Ext.Updater,[已弃用]

ExtJs为我们提供了异步方式更新dom元素内容的支持。这可以用在一些异步交互性比较强的地方,例如webgame等。我们来看看具体实现方式。

我们先在视图中写这样的html:

[html]

1
2
3
<
div
id="div1" title="d1" style="width:50px; height:50px; position:absolute; top:100px">1</
div
>
<
div
id="div2">2</
div
>
<
form
id="form1"><
input
id="a" name="a" value="20" /><
input
id="b" name="b" value="50" /></
form
>

 

1.单个元素的及时更新

现在,我要通过c#在服务端计算a+b的值,然后将结果填到div1元素里面:

[Js]

1
2
3
4
Ext.get(
"div1"
).getUpdater().update({
    
url:
"Ext/UpdaterFunc"
,
    
params: { a: 10, b: 3 }
});

[c#]

1
2
3
4
public
ContentResult UpdaterFunc(
int
a,
int
b)
{
    
return
Content(
"a+b="
+ (a + b));
}

 

页面加载后,将自动更新div1。再看看另外一种写法:

[Js]

1
2
3
4
5
6
Ext.get(
"div1"
).load({
    
url:
"Ext/UpdaterFunc"
,
    
scripts:
true
,
    
params: { a: 10, b: 47 },
    
text:
"请等待..."
});

 

2.通过提交表单更新

[Js]

1
Ext.get(
"div1"
).getUpdater().formUpdate(
"form1"
,
"Ext/UpdaterFunc"
);

 

效果一样,只不过提交的参数来源于表单,参数名为对应的name值。

3.周期性更新

[Js]

1
2
3
//周期性更新
var
up =
new
Ext.Updater(
"div1"
);
up.startAutoRefresh(5,
"Ext/UpdaterFunc"
, { a: 10, b: 47 });

 

这段代码运行后将每隔5秒钟更新一次div1,用于需要适时核对服务端和客户端状态的情形。

 

作者:李盼(Lipan)
出处: ( )
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
你可能感兴趣的文章
myeclipse下jsp页面汉字不能保存问题
查看>>
存储系统层次结构
查看>>
《浏览器渲染原理及流程》学习笔记
查看>>
文件读写
查看>>
201521123068 《java程序设计》 第13周学习总结
查看>>
c++_分巧克力(75分)
查看>>
函数内变量作用域面试题
查看>>
MySQL-----临时表
查看>>
ASCII码表完整版
查看>>
AC日记——Dividing poj 1014
查看>>
AC日记——联合权值 洛谷 P1351
查看>>
通过 Azure 媒体服务进行高速编码
查看>>
Jekyll+Github个人博客构建之路
查看>>
修改公司内部 旧 OA项目
查看>>
每天一道博弈论之“E&D”
查看>>
oracle日期时间转换
查看>>
读书笔记1
查看>>
ZjDroid工具介绍及脱壳详细示例(转)
查看>>
SDOI2017 数字表格
查看>>
git使用教程2-更新github上代码
查看>>