http://examples.ext.net/#/Events/DirectMethods/Overview/
本文在几个月前写过一次,当时刚刚使用 Ext.Net,现在重新整理一下,说说自己的理解,并附上源代码。 本 Blog 的文章我可能因为翻译问题,代码问题,理解问题,表述问题等等,都会不定期的重新整理发一下。
本文内容
- DirectMethod 基础
- 从 DirectMethod 返回一个字符串
- 给 DirectMethod 传递多个参数
- 调用 DirectMethod 静态方法,并返回一个字符串
- 从静态 DirectMethod 返回一个自定义对象
- 禁用 DirectMethod ClientProxy 的创建
- 向代理函数传递 DirectMethod 配置
DirectMethod 提供了一种直接在客户端 JavaScript 代码中调用服务器端 .Net 方法的功能。
用 [DirectMethod] 属性来修饰服务器端 public 或 public static 属性的方法,会向客户端 JavaScript 代码“公开”服务器端方法。
注意:服务器端方法必须用 public 或 public static 修饰符。
这种调用服务器端方法往往很好用,可以解决很多动态创建控件和数据加载问题(例如,根据权限动态创建按钮),以及它们造成的页面呈现问题。
例如,当页面很多控件都是动态时,每次刷新页面,Ext.Net 在获得数据后,都会自己重新按照它的式样呈现数据,此时可能报脚本错误。
我经常遇到的情况是,Ext.Net.GridPanel 和 Ext.Net.Store 刷新问题。Ext.Net 的处理顺序是,先把数据加载到 Store 里(如 Store.DataSource=new DataTable(); Store.DataBind(); ),然后再用 GridPanel 呈现。因此,如果你的顺序是反的。先为 GridPanel 动态创建行或组按钮,再调用 GridPanel.Render(),之后,向 Store 绑定数据,就很可能出现刷新问题。
假设你只使用了 Page_Load 事件进行页面初始化,并在初始化时进行 if(!IsAjaxRequest) {…} 判断。如果 debug 程序,那么,Ext.Net 框架在页面第一次初始化时,IsAjaxRequest==false,表明这第一次不是 Ajax 请求。当你对页面进行操作,并调用了服务器端方法时,无论是通过 Ext.Net 何种方式调用,之后就全是 Ajax 请求,即 IsAjaxRequest==true,此时,与 ASP.NET 程序相比,你会发现很多方法都会执行,而且有些方法会反复执行很好几次。这就是 Ajax 程序的特点——多次向服务器端请求资源,只要它需要。并且,这些请求都是局部刷新页面。
所以,我通常是,在页面初始化时,如 Page_Load,尽量先将页面的整体情况呈现给客户,即 if(!IsAjaxRequest) {…} 里的代码。然后,根据用户对页面的动作,通过直接调用服务器端方法,获得数据,呈现给用户。
事前想好,如何呈现你的页面给用户其实重要。能很大程度减少页面刷新次数、页面响应时间,提升页面性能。
DirectMethod 基础
下面演示 DirectMethod 一个简单的例子,更新 <ext:Label> 控件。
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script runat="server">></head><body><form id="form1" runat="server"><ext:ResourceManager ID="ResourceManager1" runat="server" /><ext:Button ID="Button1" runat="server" Text="Click Me" Icon="Lightning"><Listeners><Click Handler="Ext.net.DirectMethods.SetTimeStamp();" /></Listeners></ext:Button><br /><ext:Label ID="Label1" runat="server" Text='<%# DateTime.Now.ToLongTimeString() %>'Format="Server Time: {0}" /></form></body></html>