利用动态类型和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. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Web;   
  5. using Models.MySchool;   
  6. using System.Dynamic;   
  7. using Newtonsoft.Json;   
  8.   
  9. namespace JsonWeb.ajaxdata {   
  10.     /// <summary>   
  11.     /// GetDataHandler 的摘要说明   
  12.     /// </summary>   
  13.     public class GetDataHandler : IHttpHandler {   
  14.   
  15.         public void ProcessRequest(HttpContext context) {   
  16.             switch (context.Request["action"].ToLower()) {   
  17.                 case "getstudentlist": GetStudentList(context); break;   
  18.             }   
  19.         }   
  20.   
  21.         private void GetStudentList(HttpContext context) {   
  22.             MySchoolEntities dc = new MySchoolEntities();   
  23.             var query =   
  24.                 from stu in dc.Student   
  25.                 join cls in dc.Class on stu.ClassID equals cls.ClassID   
  26.                 //where cls.GradeID == 1    //可以添加的条件信息   
  27.                 orderby stu.StudentID   
  28.                 select new { stu, cls };   
  29.   
  30.             //总记录数   
  31.             int total = query.Count();   
  32.   
  33.             //分页信息   
  34.             int page=Convert.ToInt32( context.Request["page"]);   
  35.             int rows=Convert.ToInt32( context.Request["rows"]);   
  36.             query = query.Skip((page - 1) * rows).Take(rows);   
  37.   
  38.             //创建动态类型   
  39.             List<dynamic> stuList = new List<dynamic>();   
  40.             foreach (var item in query) {   
  41.                 dynamic stu = new ExpandoObject();   
  42.                 stu.StudentId = item.stu.StudentID;   
  43.                 stu.StudentName = item.stu.StudentName;   
  44.                 stu.GradeName = item.cls.Grade.GradeName;   
  45.                 stu.ClassName = item.cls.ClassName;   
  46.                 stuList.Add(stu);   
  47.             }   
  48.   
  49.             //包装datagrid所需数据   
  50.             dynamic dataJson = new ExpandoObject();   
  51.             dataJson.rows = stuList;   
  52.             dataJson.total = total;   
  53.   
  54.             //返回json内容   
  55.             string strJson = JsonConvert.SerializeObject(dataJson);   
  56.             context.Response.ContentType = "text/json";   
  57.             context.Response.Write(strJson);   
  58.         }   
  59.   
  60.         public bool IsReusable {   
  61.             get {   
  62.                 return false;   
  63.             }   
  64.         }   
  65.     }   
  66. }  

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

Code:
  1. var query =   
  2.     from stu in dc.Student   
  3.     join cls in dc.Class on stu.ClassID equals cls.ClassID   
  4.     //where cls.GradeID == 1    //可以添加的条件信息   
  5.     orderby stu.StudentID   
  6.     select new { stu, cls };  

query是一个延迟查询。
 

Code:
  1. //创建动态类型   
  2. List<dynamic> stuList = new List<dynamic>();   
  3. foreach (var item in query) {   
  4.     dynamic stu = new ExpandoObject();   
  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. <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="JsonWeb.Site1" %>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head runat="server">  
  6.     <title></title>  
  7.     <script src="<%=ResolveClientUrl("~/Scripts/jquery-1.4.2.min.js") %>type="text/javascript"></script>  
  8.     <script src="<%=ResolveClientUrl("~/Scripts/jquery.easyui.min.js") %>type="text/javascript"></script>  
  9.     <link href="Styles/easyui-themes/default/easyui.css" rel="stylesheet" type="text/css" />  
  10.     <link href="Styles/easyui-themes/icon.css" rel="stylesheet" type="text/css" />  
  11.     <asp:ContentPlaceHolder ID="head" runat="server">  
  12.     </asp:ContentPlaceHolder>  
  13. </head>  
  14. <body>  
  15.     <form id="form1" runat="server">  
  16.     <div>  
  17.         <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">  
  18.         </asp:ContentPlaceHolder>  
  19.     </div>  
  20.     </form>  
  21. </body>  
  22. </html>  
Code:
  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="DynamicType.aspx.cs" Inherits="JsonWeb.dynamictype.DynamicType" %>  
  2.   
  3. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">  
  4.     <script type="text/javascript">  
  5.         $(function(){   
  6.             $('#stuTable').datagrid({   
  7.                 title:'Student List',   
  8.                 iconCls:'icon-save',   
  9.                 width:600,   
  10.                 height:350,   
  11.                 nowrap: false,   
  12.                 striped: true,   
  13.                 collapsible: true,   
  14.                 singleSelect:true,   
  15.                 url: '<%=ResolveClientUrl("~/ajaxdata/GetDataHandler.ashx") %>?action=GetStudentListd=' + new Date().getTime(),   
  16.                 sortName: 'StudentId',   
  17.                 sortOrder: 'desc',   
  18.                 remoteSort: false,   
  19.                 idField:'StudentId',   
  20.                 columns:[[   
  21.                 {field:'StudentId',title:'StudentId',width:100},   
  22.                     { field: 'StudentName', title: 'StudentName', width: 100 },   
  23.                     { field: 'GradeName', title: 'GradeName', width: 100 },   
  24.                     { field: 'ClassName', title: 'ClassName', width: 100 }   
  25.                 ]],   
  26.                 pagination: true,   
  27.                 rownumbers:true   
  28.             });   
  29.         });   
  30.     </script>  
  31. </asp:Content>  
  32. <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">  
  33.     <table id="stuTable" />  
  34. </asp:Content>  

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

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

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









 

你可能感兴趣的:(json,数据库,datagrid,server,asp,LINQ)