Ext.Net学习笔记07:Ext.Net DirectMethods用法详解
使用DirectMethods在JS中调用C#方法
我承认,这个标题有点噱头,其实应该是通过DirectMethods,在JS中通过异步调用的方式执行服务器端的方法。
来看一个例子吧:
[DirectMethod]
public void AddToServerTime(int hours)
{
var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
this.myLabel.Text = date.ToString();
}
这是一个aspx页面中的服务器端方法,为了能够在JS中来调用,必须添加DirectMethod特性。
接下来让我们看看JS调用:
<script type="text/javascript">
function fnUpdate() {
App.direct.AddToServerTime(3);
}
</script>
就是这句话,它被定义在命名空间App.direct下,当然,这个命名空间是可以修改的,我会在接下来告诉你怎么修改。
然后添加一个按钮,在点击按钮的时候来执行fnUpdate方法。
<ext:Window runat="server" ID="win1" Width="300" Height="200" Title="DirectMethods">
<Items>
<ext:Label runat="server" ID="myLabel"></ext:Label>
</Items>
<Buttons>
<ext:Button runat="server" ID="btnUpdate" Text="更新" Handler="fnUpdate()"></ext:Button>
</Buttons>
</ext:Window>
我们这里使用的是Ext.Net按钮,你还可以使用Asp.Net按钮,或者是Html按钮,不再细说。
然后我们编译代码,刷新页面,点击这个按钮吧,你会看到window中的显示:
设置DirectMethods的命名空间
默认情况下,DirectMethods的命名空间是App.direct,我们可以通过N中方法来改变这个默认的命名空间:
在Ext.Net全局配置中更改
<extnet theme="Neptune"
directMethodNamespace="MyApp.DirectMethods
" />
这种更改方式是在web.config中完成的,如果你不知道怎么在web.config中添加extnet配置节点,那么你肯定是没有看我的第一篇笔记,去看看吧>>在ASP.NET WebForm中使用Ext.Net
这种更改方式将对所有页面有效。
在Ext.Net ResourceManager配置中更改
<ext:ResourceManager runat="server"
DirectMethodNamespace="MyApp.DirectMethods">
</ext:ResourceManager>
这种更改方式是在页面中完成的,它只对当前页面有效,当然了,它肯定是要覆盖全局的设置的。
在DirectMethod特性构造函数中更改
这是最后一种设置方式,它更加灵活,它可以更改某一个方法的命名空间。
[DirectMethod(Namespace = "MyApp.DirectMethods"
)]
public void AddToServerTime(int hours)
{
var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
this.myLabel.Text = date.ToString();
}
这种方法只对设置的方法有用,它将会覆盖页面和全局的配置。
添加回调方法
前面提到过,Ext.Net DirectMethods和DirectEvents类似,都是通过JS实现的异步调用,因此,如果要处理服务器端的执行结构,就必须在JS中添加相应的回调方法。
function fnUpdate() {
MyApp.DirectMethods.AddToServerTime(5, {
success: onSuccess,
failure: onFailure,
eventMask: { showMask: true }
});
} function onSuccess() {
alert("成功");
} function onFailure() {
alert("失败");
}
在这段代码中,我们在调用DirectMethod方法的时候添加了一些配置,包括执行成功和失败的回调方法,以及来显示一个遮罩层。
同步执行服务器端方法
一般情况下我们都是采用异步的方式来执行服务器端的方法,这样能够获得更好的用户体验,当然,如果你有怪癖,希望能够通过同步的方式来执行服务器端方法,Ext.Net DirectMethods也是支持的。
[DirectMethod(Namespace = "MyApp.DirectMethods", Async = false)]
public void AddToServerTime(int hours)
{
string text = this.btnUpdate.Text;
var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
this.myLabel.Text = text + date.ToString();
}
很简单的一个设置,在DirectMethod构造函数中配置一下就可以了。
郑重的提醒,尽量少用同步的请求,这样会造成浏览器假死的现象,至于什么是浏览器假死,你去试试抢一下春运时候的火车票就知道了(这里说的是 2014年春运的火车票,今天是2014年1月16日,目前12306的验证码校验用的就是同步请求,不知道有多少同学被卡死在校验验证码的路上……)
提升性能:调用静态方法
先来说说非静态方法,在执行非静态方法的时候,Ext.Net会提交更多的数据,使我们可以访问页面中的控件这在处理页面相关内容时候非常有用,但是当我们只是想去执行一个处理过程,而与页面无关的时候,我们就可以通过执行静态方法来提升性能。
在静态方法中,我们不能访问页面的Form数据,不能直接访问Request、Response等数据(可以通过HttpContext.Current来访问),好处是在请求的时候,Ext.Net不会将页面数据提交给服务器,大大减少了数据传输和服务器执行的时间。
[DirectMethod(Namespace = "MyApp.DirectMethods")]
public static string AddToServerTime(int hours)
{
var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
return date.ToString();
}
这是我们刚才的方法,现在把它改成了静态方法。JS的调用基本没有改变,只不过我们需要在JS中来更新控件的显示了。
function fnUpdate() {
MyApp.DirectMethods.AddToServerTime(5, {
success: onSuccess,
failure: onFailure,
eventMask: { showMask: true }
});
} function onSuccess(result) {
App.myLabel.setText(result);
}
我们需要对onSuccess回调方法进行修改,在它接收到执行结果之后更新界面显示。
Ext.net.DirectMethod.request调用WebService
DirectMethods不能直接访问WebService,但可以通过Ext.net.DirectMethod.request来请求WebService,实现类似于页面后台方法的效果。
var showRelativeServerTime = function () {
Ext.net.DirectMethod.request({
url: "EchoService.asmx/Echo",
cleanRequest: true,
params: {
something: "Hello world!"
},
success: function (result) {
alert(Ext.DomQuery.selectValue("string", result, ""));
}
});
}
这是方法的调用过程,不再演示了。
附加说明:这种方法受用于一切WebService、一般处理程序、MVC等通过url访问的东东,非常好用。
异常处理
这是一个大问题,一般情况下,如果你想偷懒,Ext.Net默认已经帮我们进行了异常处理。当然,如果你想更友好的给用户进行提示,那就来手动处理吧。
[DirectMethod]
public static int Divide(int number1, int number2)
{
if (number2 == 0)
{
ResourceManager.AjaxSuccess = false;
ResourceManager.AjaxErrorMessage = "number2 can't be zero!";
return 0;
}
return number1 / number2;
}
这样一来,我们手动的判断是否执行成功。当然,你还可以这样写:
[DirectMethod]
public static void DoSomething()
{
try
{
// call through to your business logic layer
}
catch (Exception e)
{
ResourceManager.AjaxSuccess = false
;
ResourceManager.AjaxErrorMessage = GetFriendlyMessage(e);
// Do any logging and other operations here
}
}
Ext.Net学习笔记07:Ext.Net DirectMethods用法详解的更多相关文章
- 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解
Ext.Net通过DirectEvents进行服务器端异步的事件处理.[Ext.Net学习笔记]02:Ext.Net用法概览.Ext.Net MessageBus用法.Ext.Net布局 中已经简单的 ...
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- (转)live555学习笔记10-h264 RTP传输详解(2)
参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...
- 学习笔记--Grunt、安装、图文详解
学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...
- SNMP学习笔记之SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- JQuery学习笔记系列(一)----选择器详解
笔者好长时间没有更新过博客园的笔记了,一部分原因是去年刚刚开始工作一段时间忙碌的加班,体会了一种每天加班到凌晨的充实感,之后闲暇时间了也因为自己懒惰没有坚持记笔记的习惯,现在重新拾起来. 借用古人的一 ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- HTML5学习笔记(九):选择器详解
在前面的笔记中我们已经接触过几种常见的选择器,本笔记我们将深入了解CSS的选择器. 元素选择器 最常见的 CSS 选择器是元素选择器.换句话说,文档的元素就是最基本的选择器.在 W3C 标准中,元素选 ...
- iOS5 ARC学习笔记:strong、weak等详解
2013-03-25 13:41 佚名 oschina 字号:T | T iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的.现在我们看看iOS5 ...
随机推荐
- 基础 HTML之目录问题(相对路径和绝对路径区别)
一.相对路径和绝对路径 相对路径:以引用文件之网页所在位置为参考基础,而建立出的目录路径.因此,当保存于不同目录的网页引用同一个文件时,所使用的路径将不相同,故称之为相对. 绝对路径:以Web站点根目 ...
- Storm系列(十二)架构分析之Worker-心跳信息处理
Worker通过worker-data方法定义了一个包含很多共享数据的映射集合,Worker中很多方法都依赖它 mk-worker 功能: 创建对应的计时器.Executor.接收线程接收消息 方 ...
- [转]强大的vim配置文件,让编程更随意
转自:http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配置主要有 ...
- POJ 2115 C Looooops(扩展欧几里得)
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...
- 导入excel数据
前提条件:先要安装好EXCEL软件. 程序中经常要用到导入excel数据的功能.其实通过ole操作excel就简单的几行代码,但记性不好,经常要用经常要找, 还是作篇笔记吧. var ExcelApp ...
- 【Android - 基础】之Animator属性动画
1 概述 在3.0系统之前,Android给我们提供了逐帧动画Frame Animation和补间动画Tween Animation两种动画: 1) 逐帧动画的原理很简单,就是 ...
- C socket demo
一.服务端-server.c #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> # ...
- Hadoop-2.2.0中文文档——MapReduce 下一代 -——集群配置
目的 这份文档描写叙述了怎样安装.配置和管理从几个节点到有数千个节点的Hadoop集群. 玩的话,你可能想先在单机上安装.(看单节点配置). 准备 从Apache镜像上下载一个Hadoop的稳定版本号 ...
- Android - Shared Preference (分享首选项) 具体解释
Shared Preference (分享首选项) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24454963 Sh ...
- careercup-递归和动态规划 9.5
9.5 编写一个方法,确定某字符串的所有排列组合. 类似leetcode:Permutations 解法: 跟许多递归问题一样,简单构造法非常管用.假设有个字符串S,以字符序列a1a2a...an表示 ...