用ExtJs+Linq+Wcf打造简单grid

 

本系列文章列表

1)Ajax访问Xml Web Service的安全问题以及解决方案

2)Ajax与WCF交互-WCF之美

3) Ajax与Wcf交互-JSON

4) ExtJs与WCF交互:生成树

5) 用ExtJs+Linq+Wcf打造简单grid

6) ExtJs+WCF+LINQ实现分页Grid

7) ExtJs与WCF之间的跨域访问

8) 异步调用Restful的WCF服务

9) 用Restful方式调用WCF进行上传下载

10) 再说ExtJs与WCF之间的跨域访问

11) [添砖加瓦]:ExtJS+WCF+LINQ打造全功能Grid

12) 【封装】WCF+LINQ+ExtJS做更简单的Grid

  

    上篇文章ExtJs与WCF交互:生成树中阐述了用wcf产生json数据给extjs产生树控件的用法,本文将着重讲述如何用wcf+extjs+linq打造一个支持排序和列刷选的grid。闲话少叙 ,下面是操作步骤和实现效果图

第一步:在vs2008中创建一个支持.net framework 3.5的网站,此处之所以强调支持.net framework 3.5是为了使用linq

第二步:将运行时需要的Extjs的资源文件拷贝到项目目录,具体可见示例项目

第三步:假设在本机sql2005中存在数据库sharelist,里面有一个数据表stocks,效果如下:

数据库文件sharelist.mdf在示例项目db文件夹中。如果需要测试,可以将其附加到自己的sql2005数据库服务器中。

在网站项目中创建一个Linq To Sql类:DataClasses.dbml,方法如下如所示:

点击添加之后,出现下面的Linq To Sql向导

在本文只使用左面面板,在服务器资源管理器中添加对数据库sharelist的连接,效果如下:

点击数据表stocks,然后拖动stocks数据表到左面面板,拖动后效果如下:

点击stocks,然后更改类名称为Stock:

更改后效果为:

好,到此我们基本完成了linq to sql类的设计,我们在解决方案管理器中打开生成的类代码文件中,其中包括类:Stock ,为了使其能够被WCF使用

,对类添加DataContractAttribute,对属性添加DataMemberAttribute,添加好之后的代码为: 

linq to sql类生成的代码并添加了wcf支持

在页面文件中,在<%@ ServiceHost中添加Factory="System.ServiceModel.Activation.WebServiceHostFactory",然后在web.config中将<enableWebScript/>替换成为<webHttp/>,注意这两个操作是必须的。到此wcf服务也准备齐备。

第五步:创建一个BasicGrid.aspx,然后在页面中添加extjs必要的链接和脚本支持,并添加页面元素,完成后的代码为:

BasicGrid.aspx页面文件

页面中有对<script type="text/javascript" src="array-grid.js" charset="gb2312"></script>,其中的array-grid.js便是产生grid所需要的脚本,它访问上一步中开发好的wcf服务,将服务方法GetStocks返回的json数据与extjs的grid进行绑定,具体代码如下:

ExtJs与Wcf交互生成grid的脚本代码

到此,linq部分,wcf部分,extjs部分均开发完成。  

第五步:在浏览器中浏览BasicGrid.aspx,效果图如下:  

说明大功告成。

说明:这几篇都是简单的实践,有关extjs部分绝大部分参考extjs中的示例,但也做了稍稍的修改,后面的文章会逐渐深入一些。

示例项目:
/Files/jillzhang/ExtJsWcfLinqGrid.part1.RAR
/Files/jillzhang/ExtJsWcfLinqGrid.part2.RAR

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: WCF,ExtJs,linq
posted @ 2008-06-18 22:16 Robin Zhang 阅读(5165) 评论(42)  编辑 收藏 网摘 所属分类: ajaxweb serviceWCF

  回复  引用  查看    
#1楼2008-06-18 23:00 | 哦,奇怪      
支持!
  回复  引用  查看    
#2楼2008-06-18 23:39 | Anytao      
我来捧捧场,不错的探讨:-)
  回复  引用  查看    
#3楼2008-06-19 06:46 | U2U      
很好的文章,国内关于ExtJS与WCF的交互大多都是互相抄袭。所以有自己的探讨并且写文章让大家分享讨论,不错!!不过我个人感觉,脚本代码和连接支持等似乎没必要放入aspx文件,为什么不使用静态文件呢?ExtJs就前台显示而言,仅仅用静态文件就可以了,不知道这样做效率会否更高?
  回复  引用  查看    
#4楼2008-06-19 08:34 | 高海东      
很不错,功能更强大就好了
  回复  引用  查看    
#5楼2008-06-19 08:58 | 戏水      
千里迢迢 前来支持:)
  回复  引用  查看    
#6楼2008-06-19 09:00 | 阿不      
Ext的功能很不错,与ASP.NET MVC组合也可以取得很好的效果。
  回复  引用  查看    
#7楼2008-06-19 09:07 | Jeffrey Zhao      
好小的VS窗口阿,呵呵
  回复  引用  查看    
#8楼[楼主]2008-06-19 09:12 | jillzhang      
@哦,奇怪
多谢支持
@Anytao
王兄来捧场,我特高兴
@U2U
国内关于ExtJS与WCF的交互大多都是互相抄袭
---------------------------------
实不相瞒,我这篇也是参考了ExtJs示例项目和其他人的,可能更加详细一点,该注意的地方注明了一下。作为敲门砖式的文章,我会尽量开始简单一些,多参考文档和别人的示例,以后会逐渐加入自己的东西,也是一种学习过程嘛。
@高海东
@戏水
------------------------------
哈哈,多谢啦
@阿不
你的想法,我觉得可以尝试尝试,现在我感觉比起webform来,extjs+wcf更爽了。

而且extjs支持html,页面与代码逻辑分离的更彻底一些

  回复  引用    
#9楼2008-06-19 09:13 | yaoliping[未注册用户]
服务报错

未找到终结点。


这是什么原因啊。

  回复  引用  查看    
#10楼[楼主]2008-06-19 09:16 | jillzhang      
@Jeffrey Zhao
太大了,容易撑开页面,呵呵:)

  回复  引用  查看    
#11楼[楼主]2008-06-19 09:18 | jillzhang      
@yaoliping
直接访问.svc会出现没有找到终结点
访问.svc/GetStocks就可以了

  回复  引用    
#12楼2008-06-19 09:52 | yaoliping[未注册用户]
感谢楼主:
按楼主的提示:我用IE访问
http://www.localhost.com:8800/extjswcflinqgrid/ArrayGridService.svc/GetStocks
提示:Internet Explorer 无法显示该网页
便是通过附加进程调试时,ArrayGridService.cs代码
方法 public Stock[] GetStocks() 显示有七条记录,说明是正确的.

http://localhost:8800/extjswcflinqgrid/BasicGrid.aspx
能显示表格,但表格是没有数据。
在JS文件array-grid.js 代码store.load();添加
alert('记录数:'+store.getCount());

显示为: 记录数:0

我本人对WCF基本不懂,请问楼方问题会出在什么地方。

  回复  引用  查看    
#13楼[楼主]2008-06-19 10:21 | jillzhang      
@yaoliping
你的iis支持svc后缀么?
没有配置过svc支持,要先配置

  回复  引用  查看    
#14楼2008-06-19 11:21 | Ants      
楼主:对类添加DataContractAttribute,对属性添加DataMemberAttribute
好像代码上面没有体现。。请指点

  回复  引用  查看    
#15楼2008-06-19 11:37 | dada7357      
我用VS2008自带的ASP.NET DEVELOPMENT SEVER运行LZ的程序时,和@yaoliping 的一样,通过附加进程调试时,ArrayGridService.cs代码,方法 public Stock[] GetStocks() 显示有七条记录,说明是正确的.但是

在JS文件array-grid.js 代码store.load();添加
alert('记录数:'+store.getCount());

显示为: 记录数:0


  回复  引用  查看    
#16楼2008-06-19 11:39 | Ants      
@dada7357
楼主没有在类上添加DataContractAttribute,对属性添加DataMemberAttribute ,所以没有被序列化,客户端就没有内容啦

  回复  引用  查看    
#17楼2008-06-19 12:07 | dada7357      
--引用--------------------------------------------------
Ants: @dada7357
楼主没有在类上添加DataContractAttribute,对属性添加DataMemberAttribute ,所以没有被序列化,客户端就没有内容啦

--------------------------------------------------------
不行,我加了DataContractAttribute,DataMemberAttribute 也没有数据!

  回复  引用  查看    
#18楼[楼主]2008-06-19 12:08 | jillzhang      
@yaoliping
不要用虚拟目录,用网站

  回复  引用  查看    
#19楼[楼主]2008-06-19 12:11 | jillzhang      
@Ants
楼主没有在类上添加DataContractAttribute,对属性添加DataMemberAttribute ,所以没有被序列化,客户端就没有内容啦
--------------------------------------------------------
不好意思,我原来的类是加了的,可能代码拷贝错了。
DataContract和DataMember是要加的

  回复  引用    
#20楼2008-06-19 14:52 | 手机魔卡[未注册用户]
经验分享
  回复  引用  查看    
#21楼2008-06-27 18:19 | 知秋一叶      
用文件形式打开和网站打开项目都可以运行,结果也能出来!就是需要加上DataContract和DataMember!感谢楼主无私奉献!期待下文!
  回复  引用  查看    
#22楼[楼主]2008-06-29 07:39 | jillzhang      
@知秋一叶
多谢支持

  回复  引用  查看    
#23楼2008-08-23 15:30 | XDS      
我浏览的时候,“最后更新”显示为NaN年NaN月NaN日,这是什么原因引起的呢
  回复  引用  查看    
#24楼2008-08-23 16:16 | XDS      
我发现WCF返回的JSON的数据为:
[{"company":"3m Co","price":71.72,"change":0.02,"changepercent":0.03,"lastupdated":"\/Date(1213718400000+0800)\/"},
{"company":"Alcoa Inc","price":29.01,"change":0.01,"changepercent":0.02,"lastupdated":"\/Date(1213718400000+0800)\/"},
{"company":"Altria Group Inc","price":85.03,"change":-0.02,"changepercent":-0.03,"lastupdated":"\/Date(1150473600000+0800)\/"},
{"company":"American Express Company","price":85.3,"change":0.32,"changepercent":0.12,"lastupdated":"\/Date(1213718400000+0800)\/"},
{"company":"American International Group, Inc.","price":64.12,"change":-0.01,"changepercent":-0.01,"lastupdated":"\/Date(1213718400000+0800)\/"},
{"company":"AT&T Inc.","price":52.36,"change":0.1,"changepercent":0.05,"lastupdated":"\/Date(1213718400000+0800)\/"},
{"company":"Boeing Co.","price":56.36,"change":-0.02,"changepercent":-0.01,"lastupdated":"\/Date(1213545600000+0800)\/"}]
发现日期,"lastupdated":"\/Date(1213545600000+0800)\/"的格式与EXTJS不适配,请问有什么办法可以解决吗?

  回复  引用  查看    
#25楼[楼主]2008-08-24 09:11 | jillzhang      
@XDS
我做的时候,也遇到了同样的问题
我将服务端数据契约的DateTime更改为string就可以了

  回复  引用  查看    
#26楼2008-08-31 19:56 | 菩提树下的杨过      
@XDS

DateTime不能正常序列化的问题,可以在前端用JS解决

见:
http://www.cnblogs.com/yjmyzz/archive/2008/08/31/1280735.html" target="_new">http://www.cnblogs.com/yjmyzz/archive/2008/08/31/1280735.html

  回复  引用  查看    
#27楼2008-09-02 09:16 | XDS      
@菩提树下的杨过
可以解决从WCF到Extjs的问题。但日期型字段(如:该例子中的最后最新时间)一旦编辑后就会出现错误。错误的原因在于render解析的错误。因为Extjs的日期控件生成的是标准的日期格式如(2008-09-02)而解析器是解析UTC格式,当然可以将解析器同时支持多种格式。但还有一个问题:如何将编辑完成的日期以UTC格式(即WCF生成的日期格式)传回WCF进行更新。

  回复  引用  查看    
#28楼2008-09-02 10:27 | 菩提树下的杨过      
@XDS
这个到是没试过,不过WCF的方法,好象可以分别设置Request和Response的格式,可以试下把Request设置为xml,Response设置为json,不知可行否?

  回复  引用    
#29楼2008-09-06 11:24 | junelee1211[未注册用户]
{header: "变动", width: 75, sortable: true, renderer: change, dataIndex: 'change'},

这个 renderer: change 是控制什么属性的?

  回复  引用  查看    
#30楼[楼主]2008-09-08 09:28 | jillzhang      
@菩提树下的杨过
将DateTime更改为String就可以交互了

  回复  引用  查看    
#31楼[楼主]2008-09-08 09:31 | jillzhang      
@junelee1211
render是一个类似于委托的东西
付给他的也是一个函数的名称,在显示数据的时候,会调用这个函数对元数据就行处理,比如格式化,从而个性显示,比如原始数据存储为0,1代表男女,可以写一个方法function,将0,1显示为男女。render就完成这样的功能

  回复  引用    
#32楼2008-09-10 00:36 | flygod[未注册用户]
对类添加DataContractAttribute,对属性添加DataMemberAttribute
请问这步具体怎么操作啊,我每项都是一点点跟着做的,但就是WCF服务不传出数据来,可能就是这没有设置。

  回复  引用  查看    
#33楼[楼主]2008-09-10 08:59 | jillzhang      
@flygod
wcf有传出数据,我认为你看到的可能和实际有些不符
也可能是已经传出数据了,但因为你的extjs设置有问题,所以没有显示出来
对linq生成的类添加DataContract,属性添加DataMember是非常简单的

  回复  引用    
#34楼2008-09-10 10:25 | flygod[未注册用户]
不是的,在调式程序的时候,我使用了IE封包数据查看工具,返回LINQ生成的数组的时候,WCF就是空返回值,但如果我改成返回字符串的时候,就会返回正确值,我怀疑是不是LINQ的那个地方没有设置对,它的查询出来的值不能让WCF正常调用的原因.
在VS2008的调式中,我设置了断点,可以看到return res.ToArray<Stock>(); RES数组的内容是正确的,就是不能通过WCF发送给客户端.
而且"对linq生成的类添加DataContract,属性添加DataMember"这个设置我一直没有找到地方,是手动写代码,还是在面板中设置呢?

  回复  引用  查看    
#35楼2008-10-09 09:52 | airwolf2026      
在页面文件中,在<%@ ServiceHost中添加Factory="System.ServiceModel.Activation.WebServiceHostFactory",然后在web.config中将<enableWebScript/>替换成为<webHttp/>,注意这两个操作是必须的。到此wcf服务也准备齐备。

------------------------------------------------------------------
楼主应该说明下.这两个这样改是为啥?突然冒出这两个怪怪的,上一篇已经出现过.呵呵.还没有翻MSDN哈

  回复  引用    
#36楼2008-11-21 09:45 | mark_xu[未注册用户]
你的iis支持svc后缀么?
没有配置过svc支持,要先配置

怎么配置svc支持啊 .net iss 不太熟悉

  回复  引用  查看    
#37楼2008-11-21 09:59 | airwolf2026      
楼上同学,iis要支持svc后缀要安装一个xx.在.net framework目录下.好像是3.5还是那个.忘记了.你搜索下吧.博客园里面有
  回复  引用  查看    
#38楼[楼主]2008-11-22 12:30 | jillzhang      
@mark_xu
iis 6.0支持svc需要安装.net framework 3.X
另外需要添加对svc的映射

  回复  引用    
#39楼2008-11-24 10:19 | mark_xu[未注册用户]
(ExtJs+WCF+LINQ实现分页Grid )照着你的方式做了下 returnData 返回的数据都是正确的 但是我的grid就是没有显示数据啊
怎么回事啊?急待楼主解答 谢谢!

  回复  引用    
#40楼2008-11-25 15:56 | 光华楼[未注册用户]
var proxy=new Ext.data.HttpProxy( {url:'WcfJsonService.svc/GetTeacherInfoProfile'});

var store = new Ext.data.SimpleStore({fields: [ {name: 'ID',type:'int'}, {name: 'TeacherNodeID', type: 'long'}, {name: 'PublicTel', type: 'string'}, {name: 'PublicFax', type: 'string'}, {name: 'RecordTime', type: 'date'}]});

var reader=new Ext.data.JsonReader({ },[ {name: 'ID',type:'int'}, {name: 'TeacherNodeID', type: 'long'}, {name: 'PublicTel', type: 'string'}, {name: 'PublicFax', type: 'string'}, {name: 'RecordTime', type: 'date'}] );


store=new Ext.data.Store( { proxy:proxy, reader:reader });

store.load();


var grid = new Ext.grid.GridPanel({store: store, columns: [ {id:'ID',header: "序号", width: 160, sortable: true, dataIndex: 'ID'}, {header: "教师", width: 75, sortable: true, dataIndex: 'TeacherNodeID'}, {header: "显示电话", width: 75, sortable: true, dataIndex: 'PublicTel'}, {header: "显示传真", width: 75, sortable: true,dataIndex: 'PublicFax'}, {header: "时间", width: 75, sortable: true, dataIndex: 'RecordTime'}],stripeRows: true,autoExpandColumn: 'ID', height:350, width:600, title:'教师列表', viewConfig:{ columnsText:'列', sortAscText:'升序', sortDescText:'降序' } });


我也是比着写的,不能正确显示数据。郁闷了一天了!!

  回复  引用    
#41楼2008-11-26 09:49 | 光华楼[未注册用户]
终于搞出来了,谢谢,{name: 'TeacherNodeID', type: 'long'}换成{name: 'TeacherNodeID', type: 'float'},就可以了。
  回复  引用  查看    
#42楼2009-03-30 15:30 | 展翅翱翔      

兄弟 我请教一下!  先谢了!

在 EXTJS里能动态实现类似于这样的表头格式吗??动态的静态的都可以!!最好是动态的!能否给小弟提供一些信息!!    急!!   拜托胜兄了!!!





发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1225018




相关文章:

相关链接: