以Student、Class、Grade为例,web中要显示学生基本信息,以及班级名称和年级名称。
请见数据库关系模型:
我这里介绍.Net4.0提供的动态类型和Json.net配合完成此项任务
1.创建“Ado.net实体数据模型”
2.创建一般处理程序GetDataHandler.ashx,作为后台提供数据
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Web;
- usingModels.MySchool;
- usingSystem.Dynamic;
- usingNewtonsoft.Json;
- namespaceJsonWeb.ajaxdata{
- ///<summary>
- ///GetDataHandler的摘要说明
- ///</summary>
- publicclassGetDataHandler:IHttpHandler{
- publicvoidProcessRequest(HttpContextcontext){
- switch(context.Request["action"].ToLower()){
- case"getstudentlist":GetStudentList(context);break;
- }
- }
- privatevoidGetStudentList(HttpContextcontext){
- MySchoolEntitiesdc=newMySchoolEntities();
- varquery=
- fromstuindc.Student
- joinclsindc.Classonstu.ClassIDequalscls.ClassID
- //wherecls.GradeID==1//可以添加的条件信息
- orderbystu.StudentID
- selectnew{stu,cls};
- //总记录数
- inttotal=query.Count();
- //分页信息
- intpage=Convert.ToInt32(context.Request["page"]);
- introws=Convert.ToInt32(context.Request["rows"]);
- query=query.Skip((page-1)*rows).Take(rows);
- //创建动态类型
- List<dynamic>stuList=newList<dynamic>();
- foreach(variteminquery){
- dynamicstu=newExpandoObject();
- stu.StudentId=item.stu.StudentID;
- stu.StudentName=item.stu.StudentName;
- stu.GradeName=item.cls.Grade.GradeName;
- stu.ClassName=item.cls.ClassName;
- stuList.Add(stu);
- }
- //包装datagrid所需数据
- dynamicdataJson=newExpandoObject();
- dataJson.rows=stuList;
- dataJson.total=total;
- //返回json内容
- stringstrJson=JsonConvert.SerializeObject(dataJson);
- context.Response.ContentType="text/json";
- context.Response.Write(strJson);
- }
- publicboolIsReusable{
- get{
- returnfalse;
- }
- }
- }
- }
注意:主要添加“System.Data.Entity”和Json.Net4.0版本。
讲解一下:Handler中Lambda用于数据库查询,EF框架避免了传统Ado.net冗长的代码。
- varquery=
- fromstuindc.Student
- joinclsindc.Classonstu.ClassIDequalscls.ClassID
- //wherecls.GradeID==1//可以添加的条件信息
- orderbystu.StudentID
- selectnew{stu,cls};
query是一个延迟查询。
- //创建动态类型
- List<dynamic>stuList=newList<dynamic>();
- foreach(variteminquery){
- dynamicstu=newExpandoObject();
- 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的页面
- <%@MasterLanguage="C#"AutoEventWireup="true"CodeBehind="Site1.master.cs"Inherits="JsonWeb.Site1"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <headrunat="server">
- <title></title>
- <scriptsrc="<%=ResolveClientUrl("~/Scripts/jquery-1.4.2.min.js")%>"type="text/javascript"></script>
- <scriptsrc="<%=ResolveClientUrl("~/Scripts/jquery.easyui.min.js")%>"type="text/javascript"></script>
- <linkhref="Styles/easyui-themes/default/easyui.css"rel="stylesheet"type="text/css"/>
- <linkhref="Styles/easyui-themes/icon.css"rel="stylesheet"type="text/css"/>
- <asp:ContentPlaceHolderID="head"runat="server">
- </asp:ContentPlaceHolder>
- </head>
- <body>
- <formid="form1"runat="server">
- <div>
- <asp:ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
- </asp:ContentPlaceHolder>
- </div>
- </form>
- </body>
- </html>
- <%@PageTitle=""Language="C#"MasterPageFile="~/Site1.Master"AutoEventWireup="true"CodeBehind="DynamicType.aspx.cs"Inherits="JsonWeb.dynamictype.DynamicType"%>
- <asp:ContentID="Content1"ContentPlaceHolderID="head"runat="server">
- <scripttype="text/javascript">
- $(function(){
- $('#stuTable').datagrid({
- title:'StudentList',
- iconCls:'icon-save',
- width:600,
- height:350,
- nowrap:false,
- striped:true,
- collapsible:true,
- singleSelect:true,
- url:'<%=ResolveClientUrl("~/ajaxdata/GetDataHandler.ashx")%>?action=GetStudentListd='+newDate().getTime(),
- sortName:'StudentId',
- sortOrder:'desc',
- remoteSort:false,
- idField:'StudentId',
- columns:[[
- {field:'StudentId',title:'StudentId',width:100},
- {field:'StudentName',title:'StudentName',
- {field:'GradeName',title:'GradeName',
- {field:'ClassName',title:'ClassName',width:100}
- ]],
- pagination:true,
- rownumbers:true
- });
- });
- </script>
- </asp:Content>
- <asp:ContentID="Content2"ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
- <tableid="stuTable"/>
- </asp:Content>
这里我采用了jquery-easyui的ajax控件datagrid,显示数据。最后看效果图:
实际上这个示例就是利用了.Net4.0的动态类型创建自定义类型。最后祝大家学习愉快!
下载:http://u.163.com/J6ziJT 提取码:4qf0tke8
原文链接:https://www.f2er.com/json/290784.html