Devexpress 使用经验 —— ASPxGridView前后台交互写法推荐
这里的格式是仁者见仁智者见智,这篇随笔只是我在工作过程中总结出的阅读性高,对我来说效率较高的写法。 ASPX:
<dx:ASPxGridView ID="ASPxGridViewLink" runat="server" AutoGenerateColumns="False" Width="100%" DataSourceID="ObjectDataSourceLink" KeyFieldName="LinkID"
ClientInstanceName="gridLink" OnCustomCallback="ASPxGridViewLink_CustomCallback">
<ClientSideEvents EndCallback="onASPxEndCallback" />
</dx:ASPxGridView>
关键之处:
1. 给GridView控件一个前端ID ClientInstanceName,
2. 给GridView控件一个响应"前端回调"的方法 OnCustomCallback
C#
protected void ASPxGridViewLink_CustomCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewCustomCallbackEventArgs e)
{
JSONObject jsonToken = JSONConvert.DeserializeObject(e.Parameters);
JSONObject jsonParams = (JSONObject)jsonToken["params"];
string command = jsonToken["action"].ToString();
if (command == "AddLink")
addLink(sender as DevExpress.Web.ASPxGridView.ASPxGridView, jsonParams);
} void addLink(DevExpress.Web.ASPxGridView.ASPxGridView s, JSONObject e)
{
string linkName = e["linkName"].ToString(),
linkUrl = e["linkUrl"].ToString(),
provinceId = null,
provinceName = null,
cityId = null,
cityName = null; bool isDistrict = e["isDistrict"].ToString() == "true"; int orderNum = Convert.ToInt32(e["sortNum"]); ... ... }
关键之处:
1. 响应"前段回调"的方法中的e.Parameters就是前端传回来的参数,一般来说它的类型为String, 如果有多个参数传回,最好封装为JSON格式,然后在后台解析
2. 将JSON的操作和参数解析,针对不同的操作写对应的方法,并传入参数
JS
function doAddLink() {
var token = JSON.stringify({
action: "AddLink",
params: {
linkName: tbName.GetValue(),
linkUrl: tbLink.GetValue(),
sortNum: tbSort.GetValue(),
isDistrict: chIsDistrict.GetValue(),
provinceId: comboProvicne.GetValue(),
provinceName: comboProvicne.GetText(),
cityId: comboCity.GetValue(),
cityName: comboCity.GetText()
}
});
gridLink.PerformCallback(token);
}
关键之处: 封装包含 action(执行的操作) 和 params(操作的参数) 的 JSON, 通过 GridView的前端ID 调用PerformCallback方法,并且传入JSON
其他ASPx控件Callback操作也同样适用。
其实只需一个ASPxCallback控件就可以实现复杂的Ajax交互效果。我们知道ASPxCallback是Devexpress里面一个很纯净的专门处理异步操作的控件,像很多自带Callback的控件比如ASPxGridView, ASPxComboBox, ASPxCallbackPanel等等或多或少的附带了ASPxCallback控件的功能。
下面这个示例来简单介绍ASPxCallback如何前后台交互,如何相互调用方法
首先需要给全局JS添加一个方法:
window.onASPxEndCallback = function (s, e) {
var script = s.cpScript;
if (!(script === 'undefined')) {
var func = new Function(script);
func.call();
delete s.cpScript;
}
}
这段JS是获取callback控件的cpScript属性,这个属性在后台会相应的赋值,这个值是一段可执行的js方法,如果存在该值,那么转换为Function,并且执行,执行完之后立即删除。
ASPX
<dx:ASPxCallback ID="ASPxCallback1" runat="server" OnCallback="ASPxCallback1_Callback" ClientInstanceName="callback">
<ClientSideEvents EndCallback="onASPxEndCallback" />
</dx:ASPxCallback>
同样给ClientInstanceName 赋值, 添加响应前段回调的方法 OnCallback, 关键添加 ”<ClientSideEvents EndCallback="onASPxEndCallback" />“回调方法执行完之后要调用onASPxEndCallback
C#
protected void ASPxCallback1_Callback(object source, DevExpress.Web.ASPxCallback.CallbackEventArgs e)
{ DevExpress.Web.ASPxCallback.ASPxCallback callback = source as DevExpress.Web.ASPxCallback.ASPxCallback; // 获取这个callback // 具体方法执行的内容 // 以下是后台调用前台的三种方法 callback.JSProperty["cpScript"] = string.format("alert('{0} 执行成功。'); location.href='{1}'", xxxx, yyyy); callback.JSProperty["cpScript"] = string.format(@" var name = '{0}'; function love(n){{ alert('I love you ' + n); }} // 在string.format中,'{' 需要用'{{'来转义,同样 '}'需要用'}}'来转义 love(name); ", xxxx); callback.JSProperty["cpScript"] = string.format("someFunction({0})", xxxx); // 这里的 someFunction 是在前段js里写的方法 }
JS
这里是前台调用后台的方法
fucntion onButtonClicked(){ var param = JSON.stringify{ a: '1', b: '2'
} callback.PerformCallback(param); // PerformCallback执行之后会调用后台的 void ASPxCallback1_Callback 事件,后台的操作在这里处理。
}
总而言之,Devexpress实在是非常强大控件,仅仅一个简单的ASPxCallback 就可以省略.NET中用各种ashx来处理ajax请求, 大大提高了编码的阅读性。
下一篇将展示一个简单地区级联操作。
Devexpress 使用经验 —— ASPxGridView前后台交互写法推荐的更多相关文章
- Devexpress 使用经验 —— ASPxGridView命令行自定义按钮灵活使用
ASPX <dx:ASPxGridView ID="ASPxGridView1" runat="server" DataSourceID="Ob ...
- DevExpress之ASPxGridView笔记(1)
1.设置Row(某列)输出格式,例如,在数字前加美元符.每3位以逗号隔开及设置小数点后两位: <dx:GridViewDataTextColumn FieldName="SHOUHUI ...
- ajax的底层前后台交互
为什么用ajax或者它的优点: 异步加载数据,无需切换页面 更加的用户体验,局部刷新,及时验证,操作步骤简化: 节省流量 js控制数据的加载,更加灵活多用. 底层就是XMLHttpRequest对象: ...
- devexpress中ASPxGridView控件初始化赋值
写在ASPxGridView中OnCellEditorInitialize="ASPxGridView_progoods_CellEditorInitialize" 事件中: / ...
- jquery ajax返回json数据进行前后台交互实例
jquery ajax返回json数据进行前后台交互实例 利用jquery中的ajax提交数据然后由网站后台来根据我们提交的数据返回json格式的数据,下面我来演示一个实例. 先我们看演示代码 代码如 ...
- JAVA配置&注解方式搭建简单的SpringMVC前后台交互系统
前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...
- ajax实现异步前后台交互,模拟百度搜索框智能提示
1.什么是异步?在传统的网站项目中,填写一堆数据,最后点击提交,在点击提交的这一刻才实现数据提交,前后台交互.在你点击提交之前数据是没有提交到后台的.这样就会造成很大的不便.比如,我填了一大堆数据,结 ...
- 前后台交互经常使用的技术汇总(后台:Java技术,前台:Js或者Jquery)
1:由于针对特定的前后台交互用到的知识总结,所以不大量贴代码,主要给出思路,方便自己以后脑补和技术总结,当然也希望可以帮助到别人. 后台Json和其他格式转化,之前总结过Json和对象,集合,字符串的 ...
- WebSocket前后台交互
其实对于前后台交互有很多种方法(只列举我知道的,嘻嘻): 1:from 表单: 使用场景——小信息量提交给后台 2:ajax(跨域的话用jsonp): 可以进行多量的前后台信心传递: 但实时性不高,不 ...
随机推荐
- java基于xml配置的通用excel单表数据导入组件(二、xml配置文件解析加载)
1.BN_ImportExcel.java 对应xml主节点属性 package XXXXX.manage.importexcel; import java.io.Serializable; impo ...
- Json遇到引号需要转义的问题
首先看一个简单的Json格式的数据: {data:{id:1,text:"this is text",src:"abc/abc/abc.png"},succes ...
- 如何设置SVN提交时强制添加注释
windows版本: 1.新建一个名为pre-commit.bat的文件并将该文件放在创建的库文件的hooks文件夹中 2.pre-commit.bat文件的内容如下: @echo off set S ...
- (转载)PureMVC 练习时的注意事项
(转载)http://blog.sina.com.cn/s/blog_4d5a45ce01010axd.html 1.主文件里实例化facade. 把主要的UI都放进去2.第二步创建VO3.UserF ...
- Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子 第一个例子都是比较简单的博客园登录界面,就像学习编程语言时候都是从Hello,World!开始. 1 ...
- (转)Python:self
原文:http://www.douban.com/group/topic/19376685/ 这是对前面一个php程序员问python方法为什么要手写一个self的回答,当时那个帖非常的热闹,但是下面 ...
- ASP.NET MVC中混合WebForm
新建一个名为WebForms的文件夹用于存放WebForm页面文件. // 忽略对 WebForms 路径的路由routes.IgnoreRoute("WebForms/{weform}&q ...
- Tyvj P1463 智商问题 分块
P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...
- usaco 地震 && 奶牛观光
Usaco 地震: Description 一场地震把约翰家的牧场摧毁了,坚强的约翰决心重建家园.约翰已经重建了N个牧场, 现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发现可供修建的道路 ...
- Codeforces 264B 数论+DP
题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...