以Student、Class、Grade为例,web中要显示学生基本信息,以及班级名称和年级名称。
请见数据库关系模型:
由于班级名称和年级名称在不同的表中,通常采用两种方式实现:
1. 使用创建视图,视图中包含学生、班级、年级信息,然后获取数据集合,后台以json返回web层ui,然后显示给用户;
2. 创建自定义类型,包含学生、班级、年级信息,通过linq获取数据集合,然后同样以json返回显示;
由于
DAL
层都是通过
linQ
获取,这两种方法本质是一样的。
我这里介绍.Net4.0提供的动态类型和Json.net配合完成此项任务
1.创建“Ado.net实体数据模型”
2.创建一般处理程序GetDataHandler.ashx,作为后台提供数据
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using Models.MySchool;
- using System.Dynamic;
- using Newtonsoft.Json;
-
- namespace JsonWeb.ajaxdata {
-
-
-
- public class GetDataHandler : IHttpHandler {
-
- public void ProcessRequest(HttpContext context) {
- switch (context.Request["action"].ToLower()) {
- case "getstudentlist": GetStudentList(context); break;
- }
- }
-
- private void GetStudentList(HttpContext context) {
- MySchoolEntities dc = new MySchoolEntities();
- var query =
- from stu in dc.Student
- join cls in dc.Class on stu.ClassID equals cls.ClassID
-
- orderby stu.StudentID
- select new { stu, cls };
-
-
- int total = query.Count();
-
-
- int page=Convert.ToInt32( context.Request["page"]);
- int rows=Convert.ToInt32( context.Request["rows"]);
- query = query.Skip((page - 1) * rows).Take(rows);
-
-
- List<dynamic> stuList = new List<dynamic>();
- foreach (var item in query) {
- dynamic stu = new ExpandoObject();
- stu.StudentId = item.stu.StudentID;
- stu.StudentName = item.stu.StudentName;
- stu.GradeName = item.cls.Grade.GradeName;
- stu.ClassName = item.cls.ClassName;
- stuList.Add(stu);
- }
-
-
- dynamic dataJson = new ExpandoObject();
- dataJson.rows = stuList;
- dataJson.total = total;
-
-
- string strJson = JsonConvert.SerializeObject(dataJson);
- context.Response.ContentType = "text/json";
- context.Response.Write(strJson);
- }
-
- public bool IsReusable {
- get {
- return false;
- }
- }
- }
- }
注意:主要添加“System.Data.Entity”和Json.Net4.0版本。
讲解一下:Handler中Lambda用于数据库查询,EF框架避免了传统Ado.net冗长的代码。
- var query =
- from stu in dc.Student
- join cls in dc.Class on stu.ClassID equals cls.ClassID
-
- orderby stu.StudentID
- select new { stu, cls };
query是一个延迟查询。
-
- List<dynamic> stuList = new List<dynamic>();
- foreach (var item in query) {
- dynamic stu = new ExpandoObject();
- stu.StudentId = item.stu.StudentID;
- stu.StudentName = item.stu.StudentName;
- stu.GradeName = item.cls.Grade.GradeName;
- stu.ClassName = item.cls.ClassName;
- stuList.Add(stu);
- }
最终要返回自定义的Student,免去创建自定义类型,这里采用了dynamic类型,即动态类型;然后可以给stu对象添加自定义属性,再把stu对象加入集合,这样后台就得到我们所需的集合。接下来就是Object->Json问题了,以前必须用[Serializable]标记或者[DataContract]来进行序列化标记,现在类型都没有,怎么办呢?
幸好Json.Net为我们解决了这些问题,大家可以到http://james.newtonking.com/default.aspx下载最新dll。
3.创建母版页和内容页DynamicType.aspx,作为显示UI的页面
- <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="JsonWeb.Site1" %>
-
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- <script src="<%=ResolveClientUrl("~/Scripts/jquery-1.4.2.min.js") %>" type="text/javascript"></script>
- <script src="<%=ResolveClientUrl("~/Scripts/jquery.easyui.min.js") %>" type="text/javascript"></script>
- <link href="Styles/easyui-themes/default/easyui.css" rel="stylesheet" type="text/css" />
- <link href="Styles/easyui-themes/icon.css" rel="stylesheet" type="text/css" />
- <asp:ContentPlaceHolder ID="head" runat="server">
- </asp:ContentPlaceHolder>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
- </asp:ContentPlaceHolder>
- </div>
- </form>
- </body>
- </html>
- <%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="DynamicType.aspx.cs" Inherits="JsonWeb.dynamictype.DynamicType" %>
-
- <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
- <script type="text/javascript">
- $(function(){
- $('#stuTable').datagrid({
- title:'Student List',
- iconCls:'icon-save',
- width:600,
- height:350,
- nowrap: false,
- striped: true,
- collapsible: true,
- singleSelect:true,
- url: '<%=ResolveClientUrl("~/ajaxdata/GetDataHandler.ashx") %>?action=GetStudentListd=' + new Date().getTime(),
- sortName: 'StudentId',
- sortOrder: 'desc',
- remoteSort: false,
- idField:'StudentId',
- columns:[[
- {field:'StudentId',title:'StudentId',width:100},
- { field: 'StudentName', title: 'StudentName', width: 100 },
- { field: 'GradeName', title: 'GradeName', width: 100 },
- { field: 'ClassName', title: 'ClassName', width: 100 }
- ]],
- pagination: true,
- rownumbers:true
- });
- });
- </script>
- </asp:Content>
- <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
- <table id="stuTable" />
- </asp:Content>
这里我采用了jquery-easyui的ajax控件datagrid,显示数据。最后看效果图:
实际上这个示例就是利用了.Net4.0的动态类型创建自定义类型。最后祝大家学习愉快!
下载:http://u.163.com/J6ziJT 提取码:4qf0tke8