MVC - 11.DTO

1.重要:javaScriptSerializer 无法识别被序列化的对象里各种属性是否存在  循环依赖

(System,Web.Script.Serialization.JavaScriptSerializer)

所以,我们不能使用javaScriptSerializer 去序列化 EF 实体对象A 。

因为javaScriptSerializer 会循环 EF 实体对象 A 里的每个属性,想要根据此属性生成对应的Json字符串,但是,EF 实体A 的外键(导航)属性如果被访问,则自动去数据库获取,而这个导航属性对应的实体类 B 中可能又包含指向实体 A 的类型,那么,EF又会去加载 A 的数据,然后 A里又包含B。。。。。陷入死循环。。。

(参考2013-5-31-mvc)

 

2.后台如果取数据需要转换成json发送到前台如图,Class就不能获取数据。所以我们需要采用DTO

 

 

2.1.前台ajax请求Student数据

Stu/Index.cshtml
Stu/Index.cshtml

@{
    ViewBag.Title = "学员列表";
}
@section headSection{
    <script type="text/javascript">
        $(function () {
            //0.关闭Jquery的浏览器缓存
            $.ajaxSetup({ cache: false });
            loadPageList(1);
        });

        //根据页码 异步请求数据
        function loadPageList(pageIndex) {
            $.get("/Stu/List/" + pageIndex, null, function(jsonData) {
                alert(jsonData.msg);
            },"json");
        }
    </script>
}
<table border="1" cellspacing="0" cellpadding="0" width="100%">
    <tr>
        <th>ID</th>
        <th>班级名</th>
        <th>姓名</th>
        <th>性别</th>
        <th>操作</th>
    </tr>
    <tr>

    </tr>
</table>

 

2.2.后台获取数据

//根据页码加载数据 此方法的Id其实是页码
        public ActionResult List(int id)
        {
            //页码
            int pageIndex = id;
            //页容量
            int pageSize = 2;
            //2.1 根据页码获取分页数据

            List<Models.Student> list = db.Students.Include("Class").OrderBy(s => s.StudentID)
                .Take(pageSize).Skip((pageIndex - 1) * pageSize).ToList();

            //2.2 获取总行数
            int rowCount = db.Students.Count();
            //2.3 计算总页数
            int pageCount = Convert.ToInt32(Math.Ceiling((rowCount*1.0)/pageSize));

            return null;
        }

 

3.这个时候我们来创建DTO

 

注意:

1.去掉virtual

public virtual Class Class { get; set; }

2.//public class Class{...} //报错

    //这里ClassDTO.cs不能是用Class.cs同名类,因为EF不认识,会报下列错误

    //CLR到EDM的类型映射不明确,因为多个CLR类型与EDM类型“Class”匹配,

 

StudentDTO.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models.DTO
{
    //public class Student{...} //报错
    //这里StudentDTO.cs不能是用Student.cs同名类,因为EF不认识,会报下列错误
    //CLR到EDM的类型映射不明确,因为多个CLR类型与EDM类型“Student”匹配,
    public class StudentDTO
    {
        public int StudentID { get; set; }
        public Nullable<int> Cid { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public Nullable<int> Isdel { get; set; }
        public Nullable<System.DateTime> AddTime { get; set; }

        //注意这里是ClassDTO类型
        public ClassDTO Class { get; set; }
    }
}

 

ClassDTO.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models.DTO
{
    //public class Class{...} //报错
    //这里ClassDTO.cs不能是用Class.cs同名类,因为EF不认识,会报下列错误
    //CLR到EDM的类型映射不明确,因为多个CLR类型与EDM类型“Class”匹配,
    public class ClassDTO
    {
        public ClassDTO()
        {
            this.Students = new List<Student>();
        }
        public int Cid { get; set; }
        public string CName { get; set; }
        public Nullable<int> CCount { get; set; }
        public string CImg { get; set; }
        public string CIsdel { get; set; }
        public Nullable<System.DateTime> Addtime { get; set; }
        public  ICollection<Student> Students { get; set; }
    }
}

 

4.将EF查询出来的 EF实体集合 转换成 Dto(Data Transfer Object)数据传输类型

List<Models.DTO.StudentDTO> list = db.Students.Include("Class").OrderBy(s => s.StudentID)
                .Take(pageSize).Skip((pageIndex - 1) * pageSize).ToList()
                .Select(s => new Models.DTO.StudentDTO() {StudentID=s.StudentID,Cid=s.Cid}).ToList(); //将EF查询出来的 EF实体集合 转换成 Dto(Data Transfer Object)数据传输类型

 

4.1.Select(s => new Models.DTO.StudentDTO() {StudentID=s.StudentID,Cid=s.Cid}).ToList();

//将EF查询出来的 EF实体集合 转换成 Dto(Data Transfer Object)数据传输类型

如果自己在类里面写个方法,把它转换为DTO,就不用每次写一样的这么麻烦了。所以我们在Models文件夹添加一个类

注意:

1.partial class Class

2.ClassPart.cs 返回类型是DTO.ClassDTO

3.StudentPart.cs 里面 Class = this.Class.ToDto()

这里要注意的是 StudentDTO.cs 类文件里面的 public ClassDTO Class { get; set; }

不然会报错,无法将类型“_06MVCAjax_CodeFirst.Models.DTO.ClassDTO”隐式转换为“_06MVCAjax_CodeFirst.Models.Class”

ClassPart.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models
{
    public partial class Class
    {
        /// <summary>
        /// 将 ED的班级对象转成 DTO 的班级对象
        /// </summary>
        /// <returns></returns>
        public DTO.ClassDTO ToDto()
        {
            return new DTO.ClassDTO()
            {
                Cid = this.Cid,
                CName = this.CName,
                CCount = this.CCount,
                CImg = this.CImg,
                CIsdel = this.CIsdel,
                Addtime = this.Addtime
            };
        }
    }
}

 

StudentPart.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models
{

    public partial class Student
    {
        /// <summary>
        /// 将 EF Student实体转换成 DTO 学员实体
        /// </summary>
        public DTO.StudentDTO ToDto()
        {
            return new DTO.StudentDTO()
            {
                StudentID = this.StudentID,
                Cid = this.Cid,
                Name = this.Name,
                Gender = this.Gender,
                Isdel = this.Isdel,
                AddTime = this.AddTime,
                Class = this.Class.ToDto()
            };
        }
    }
}

 

5.将数据封装到 PagedDataModel 实体

写个类PagedDataModel<T>

 

PagedDataModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models
{
    /// <summary>
    /// 分页数据实体
    /// </summary>
    public class PagedDataModel<T>
    {
        /// <summary>
        /// 封装数据
        /// </summary>
        public List<T> PageData { get; set; }
        /// <summary>
        /// 页码
        /// </summary>
        public int PageIndex { get; set; }
        /// <summary>
        /// 页容量
        /// </summary>
        public int PageSize { get; set; }
        /// <summary>
        /// 总页数
        /// </summary>
        public int PageCount { get; set; }
        /// <summary>
        /// 总行数
        /// </summary>
        public int RowCount { get; set; }
    }
}

 

6.将分页数据实体 封装到 json标准格式实体中

JsonModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace _06MVCAjax_CodeFirst.Models
{
    /// <summary>
    /// Json数据实体
    /// </summary>
    public class JsonModel
    {
        public object Data { get; set; }
        public string Msg { get; set; }
        public string Statu { get; set; }
        public string BackUrl { get; set; }
    }
}

 

7.最后的控制器里的List方法

StuController.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace _06MVCAjax_CodeFirst.Controllers
{
    public class StuController : Controller
    {
        //
        // GET: /Stu/

        private Models.SingleTestContext db = new Models.SingleTestContext();

        public ActionResult Index()
        {
            return View();
        }

        //根据页码加载数据 此方法的Id其实是页码
        public ActionResult List(int id)
        {
            //页码
            int pageIndex = id;
            //页容量
            int pageSize = 2;
            //2.1 根据页码获取分页数据

            List<Models.DTO.StudentDTO> list = db.Students.Include("Class").OrderBy(s => s.StudentID)
                .Take(pageSize).Skip((pageIndex - 1) * pageSize).ToList()
                .Select(s => s.ToDto()).ToList(); //将EF查询出来的 EF实体集合 转换成 Dto(Data Transfer Object)数据传输类型

            //2.2 获取总行数
            int rowCount = db.Students.Count();
            //2.3 计算总页数
            int pageCount = Convert.ToInt32(Math.Ceiling((rowCount * 1.0) / pageSize));

            //2.4 将数据封装到 PagedDataModel 实体
            Models.PagedDataModel<Models.DTO.StudentDTO> dataModel = new Models.PagedDataModel<Models.DTO.StudentDTO>()
                                                                {
                                                                    PageData = list,
                                                                    PageCount = pageCount,
                                                                    PageIndex = pageIndex,
                                                                    PageSize = pageSize
                                                                };
            //2.5 将分页数据实体 封装到 json标准格式实体中
            Models.JsonModel jsonModel = new Models.JsonModel()
                                             {
                                                 Data = dataModel,
                                                 Msg = "成功",
                                                 Statu = "OK"
                                             };
            //System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
            //string x = js.Serialize(jsonModel);
            //2.6 生成json 格式数据,Json方法是Controller类(控制器类)提供的
            //JsonRequestBehavior.AllowGet 一般啊只使用post传输,如果使用get,需要设置AllowGet
            return Json(jsonModel, JsonRequestBehavior.AllowGet);
        }
    }
}

 

string x = js.Serialize(jsonModel);

 

 

8.错误

8.1.get请求报错

 

//2.6 生成json 格式数据,Json方法是Controller类(控制器类)提供的

//JsonRequestBehavior.AllowGet 一般啊只使用post传输,如果使用get,需要设置AllowGet

return Json(jsonModel, JsonRequestBehavior.AllowGet);

8.2.查询的时候没加ToList(),不识别ToDto()方法

MVC - 11.DTO,布布扣,bubuko.com

时间: 2024-08-09 17:12:17

MVC - 11.DTO的相关文章

MVC - 11(下).jquery.tmpl.js 接收JSON类型数据循环

继续 mvc-11(上).dto:http://www.cnblogs.com/tangge/p/3840060.html jquery.tmpl.js 下载:http://pan.baidu.com/s/1o68w7Ke   1.前台 Index.cshtml @{ ViewBag.Title = "学员列表"; } @section headSection{ <script type="text/x-jquery-tmpl" id="trtemp

spring mvc 11——整合SSM

开发环境 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 数据库环境 创建一个存放书籍数据的数据库表 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; DROP TABLE IF EXISTS `books`; CREATE TABLE `books` ( `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id', `bookName` VARCHAR(100) NOT NULL

spring mvc踩坑记

前言 主要介绍自己在学习spring mvc过程中踩到的一些坑,涉及到当时遇到这个错误是如何思考的,对思路进行总结,下次遇到类似的错误能够提供一些思路甚至快速解决. 环境准备 jdk8,spring4.3.3.RELEASE,spring mvc与spring版本一致,maven3.2.5,tomcat7 目标: 1.测试spring mvc的json参数绑定功能 2.测试spring mvc的返回json功能 项目目录(已经推送到github:https://github.com/Coming

MVC中的模型注解

authour: chenboyi updatetime: 2015-04-26 21:28:42 friendly link:   目录: 1,思维导图 2,内容解析 3,CodeSimple 1,思维导图 2,内容解析 //模型注解 2.1.DisplayName(“程序员自定义文字”)配合 @Html.EditorForModel(),  @Html.DisplayNameFor(),               @Html.LabelFor(),@Html.ValidationMessa

Spring MVC 基础注解之@RequestMapping、@Controller、(二)

我现在学的是spring4.2 今天主要学习了Spring MVC注解 引入注解可以减少我们的代码量,优化我们的代码. @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: 还是以示例来解释说明 1 创建springAnnotation02项目,导入jar包. 这里的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:x

7 天玩转 ASP.NET MVC — 第 1 天

0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET MVC 开发者,这很酷吧! 7 天玩儿 转 ASP.NET MVC — 第 1 天 第一天是热身运动,这篇我们将围绕 Controller 和 Views 实践两个 Labs.在每个 Lab 之中都伴随着一些 Question 和 Answer.所以文章的主体框架是 Lab 和 Q&A. 7 天玩儿

(二)spring MVC配置

使用Maven添加依赖的jar包 第一个还没用上 刚开始没加spring-context,@Controller没法用 web.xml配置 1.       配置DispatcherServlet <servlet>        <description>Spring MVC Servlet</description>        <servlet-name>springMVC</servlet-name>        <servle

SSM中的MVC结构分析,SSM框架的响应流程

今天头一次配置成功一个SSM框架,兴奋之余,还应该从使用的角度,将整个ssm配置的方法,配置的原因,认真的分析一下.在结束了对SSM框架简单的分析之后,就要开始回归基础,全面的认真复习.所以这个文档,要尽量的完整,目标就是,这个文档是是对SSM框架的学习,也是一个将来复习的资料. 这个版本中的代码貌似无法复制,我将可以也可复制版也发布了,在我的博客中,但是没有很好的样式. 1 resources 配置文件 1.1 配置文件简介 这个部分用来解读在resources文件夹下的配置信息.这一部分是整

7.6日总结

一.事务 事务:通俗理解,事务其实就是一系列指令的集合. 事务的四个特性: 原子性:操作这些指令时,要么全部执行成功,要么全部不执行.只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态. 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定. 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响.只有在事务确定正确提交之后,才会显示该事务对数据的改变.其他事务才能获取到这些改变后的