利用动态类型和Json.net创建自定义数据

前端之家收集整理的这篇文章主要介绍了利用动态类型和Json.net创建自定义数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

以Student、Class、Grade为例,web中要显示学生基本信息,以及班级名称和年级名称
请见数据库关系模型:

由于班级名称和年级名称在不同的表中,通常采用两种方式实现:

1. 使用创建视图,视图中包含学生、班级、年级信息,然后获取数据集合,后台以json返回web层ui,然后显示用户
2. 创建自定义类型,包含学生、班级、年级信息,通过linq获取数据集合,然后同样以json返回显示
由于 DAL 层都是通过 linQ 获取,这两种方法本质是一样的。
我这里介绍.Net4.0提供的动态类型和Json.net配合完成此项任务
1.创建“Ado.net实体数据模型”

2.创建一般处理程序GetDataHandler.ashx,作为后台提供数据

Code:
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Web;
  5. usingModels.MySchool;
  6. usingSystem.Dynamic;
  7. usingNewtonsoft.Json;
  8. namespaceJsonWeb.ajaxdata{
  9. ///<summary>
  10. ///GetDataHandler的摘要说明
  11. ///</summary>
  12. publicclassGetDataHandler:IHttpHandler{
  13. publicvoidProcessRequest(HttpContextcontext){
  14. switch(context.Request["action"].ToLower()){
  15. case"getstudentlist":GetStudentList(context);break;
  16. }
  17. }
  18. privatevoidGetStudentList(HttpContextcontext){
  19. MySchoolEntitiesdc=newMySchoolEntities();
  20. varquery=
  21. fromstuindc.Student
  22. joinclsindc.Classonstu.ClassIDequalscls.ClassID
  23. //wherecls.GradeID==1//可以添加的条件信息
  24. orderbystu.StudentID
  25. selectnew{stu,cls};
  26. //总记录数
  27. inttotal=query.Count();
  28. //分页信息
  29. intpage=Convert.ToInt32(context.Request["page"]);
  30. introws=Convert.ToInt32(context.Request["rows"]);
  31. query=query.Skip((page-1)*rows).Take(rows);
  32. //创建动态类型
  33. List<dynamic>stuList=newList<dynamic>();
  34. foreach(variteminquery){
  35. dynamicstu=newExpandoObject();
  36. stu.StudentId=item.stu.StudentID;
  37. stu.StudentName=item.stu.StudentName;
  38. stu.GradeName=item.cls.Grade.GradeName;
  39. stu.ClassName=item.cls.ClassName;
  40. stuList.Add(stu);
  41. }
  42. //包装datagrid所需数据
  43. dynamicdataJson=newExpandoObject();
  44. dataJson.rows=stuList;
  45. dataJson.total=total;
  46. //返回json内容
  47. stringstrJson=JsonConvert.SerializeObject(dataJson);
  48. context.Response.ContentType="text/json";
  49. context.Response.Write(strJson);
  50. }
  51. publicboolIsReusable{
  52. get{
  53. returnfalse;
  54. }
  55. }
  56. }
  57. }

注意:主要添加“System.Data.Entity”和Json.Net4.0版本。
讲解一下:Handler中Lambda用于数据库查询,EF框架避免了传统Ado.net冗长的代码

Code:
  1. varquery=
  2. fromstuindc.Student
  3. joinclsindc.Classonstu.ClassIDequalscls.ClassID
  4. //wherecls.GradeID==1//可以添加的条件信息
  5. orderbystu.StudentID
  6. selectnew{stu,cls};

query是一个延迟查询

Code:
  1. //创建动态类型
  2. List<dynamic>stuList=newList<dynamic>();
  3. foreach(variteminquery){
  4. dynamicstu=newExpandoObject();
  5. stu.StudentId=item.stu.StudentID;
  6. stu.StudentName=item.stu.StudentName;
  7. stu.GradeName=item.cls.Grade.GradeName;
  8. stu.ClassName=item.cls.ClassName;
  9. stuList.Add(stu);
  10. }

最终要返回自定义的Student,免去创建自定义类型,这里采用了dynamic类型,即动态类型;然后可以给stu对象添加自定义属性,再把stu对象加入集合,这样后台就得到我们所需的集合。接下来就是Object->Json问题了,以前必须用[Serializable]标记或者[DataContract]来进行序列化标记,现在类型都没有,怎么办呢?
幸好Json.Net为我们解决了这些问题,大家可以到http://james.newtonking.com/default.aspx下载最新dll。

3.创建母版页和内容页DynamicType.aspx,作为显示UI的页面

Code:
  1. <%@MasterLanguage="C#"AutoEventWireup="true"CodeBehind="Site1.master.cs"Inherits="JsonWeb.Site1"%>
  2. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <htmlxmlns="http://www.w3.org/1999/xhtml">
  4. <headrunat="server">
  5. <title></title>
  6. <scriptsrc="<%=ResolveClientUrl("~/Scripts/jquery-1.4.2.min.js")%>"type="text/javascript"></script>
  7. <scriptsrc="<%=ResolveClientUrl("~/Scripts/jquery.easyui.min.js")%>"type="text/javascript"></script>
  8. <linkhref="Styles/easyui-themes/default/easyui.css"rel="stylesheet"type="text/css"/>
  9. <linkhref="Styles/easyui-themes/icon.css"rel="stylesheet"type="text/css"/>
  10. <asp:ContentPlaceHolderID="head"runat="server">
  11. </asp:ContentPlaceHolder>
  12. </head>
  13. <body>
  14. <formid="form1"runat="server">
  15. <div>
  16. <asp:ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
  17. </asp:ContentPlaceHolder>
  18. </div>
  19. </form>
  20. </body>
  21. </html>
Code:
  1. <%@PageTitle=""Language="C#"MasterPageFile="~/Site1.Master"AutoEventWireup="true"CodeBehind="DynamicType.aspx.cs"Inherits="JsonWeb.dynamictype.DynamicType"%>
  2. <asp:ContentID="Content1"ContentPlaceHolderID="head"runat="server">
  3. <scripttype="text/javascript">
  4. $(function(){
  5. $('#stuTable').datagrid({
  6. title:'StudentList',
  7. iconCls:'icon-save',
  8. width:600,
  9. height:350,
  10. nowrap:false,
  11. striped:true,
  12. collapsible:true,
  13. singleSelect:true,
  14. url:'<%=ResolveClientUrl("~/ajaxdata/GetDataHandler.ashx")%>?action=GetStudentListd='+newDate().getTime(),
  15. sortName:'StudentId',
  16. sortOrder:'desc',
  17. remoteSort:false,
  18. idField:'StudentId',
  19. columns:[[
  20. {field:'StudentId',title:'StudentId',width:100},
  21. {field:'StudentName',title:'StudentName',
  22. {field:'GradeName',title:'GradeName',
  23. {field:'ClassName',title:'ClassName',width:100}
  24. ]],
  25. pagination:true,
  26. rownumbers:true
  27. });
  28. });
  29. </script>
  30. </asp:Content>
  31. <asp:ContentID="Content2"ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
  32. <tableid="stuTable"/>
  33. </asp:Content>

这里我采用了jquery-easyui的ajax控件datagrid,显示数据。最后看效果图:

实际上这个示例就是利用了.Net4.0的动态类型创建自定义类型。最后祝大家学习愉快!

下载:http://u.163.com/J6ziJT 提取码:4qf0tke8

原文链接:https://www.f2er.com/json/290784.html

猜你在找的Json相关文章