用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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: WCF, ExtJs, linq
posted @ 2008-06-18 22:16 Robin Zhang 阅读(7883) 评论(48) 编辑 收藏

 回复 引用 查看   
#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

 回复 引用 查看   
#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里能动态实现类似于这样的表头格式吗??动态的静态的都可以!!最好是动态的!能否给小弟提供一些信息!!    急!!   拜托胜兄了!!!


 回复 引用 查看   
#43楼 2010-05-13 14:02 胡枫      
真的讲的蛮到位的,没接触过wcf的我,一下子就看懂了,本来不想回复的,最后还是决定登录后来回复支持一下,谢谢。
 回复 引用 查看   
#44楼 2010-09-17 10:04 123456603      
这功能确实不错呀,呵呵
 回复 引用 查看   
#45楼 2010-09-17 10:04 123456603      
WCF还没有了解过呢
 回复 引用 查看   
#46楼 2010-12-16 10:34 bxr0402071101      
您好 同样的问题 为什么我吧您的数据库也附件了 数据库的密码也设置的没问题,为什么又是不加载数据呢? 请求支援
 回复 引用 查看   
#47楼 2010-12-31 10:45 Markmao      
老师,你好!
部署在IIS上户出现如下错误:
请问怎么搞啊
联系邮箱:markmao_love@126.com

谢谢
“/TestDemoWeb”应用程序中的服务器错误。
--------------------------------------------------------------------------------

IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used.
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used.

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:

[InvalidOperationException: IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used.]
System.ServiceModel.Web.WebServiceHost.SetBindingCredentialBasedOnHostedEnvironment(ServiceEndpoint serviceEndpoint, AuthenticationSchemes supportedSchemes) +446264
System.ServiceModel.Web.WebServiceHost.AddAutomaticWebHttpBindingEndpoints(ServiceHost host, IDictionary`2 implementedContracts, String multipleContractsErrorMessage) +709
System.ServiceModel.Web.WebServiceHost.OnOpening() +203
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +229
System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +121
System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479

[ServiceActivationException: The service '/TestDemoWeb/ArrayGridService.svc' cannot be activated due to an exception during compilation. The exception message is: IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used..]
System.ServiceModel.AsyncResult.End(IAsyncResult result) +11599786
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context) +23
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75




--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.3615; ASP.NET 版本:2.0.50727.3618

 回复 引用 查看   
#48楼 2012-01-19 16:12 烟云过      
@U2U
嘿嘿 和我想法一样
不过目前做法是把不用的 引用全部删掉
vs有方法的