需求描述

一个比较复杂的页面,界面中包含的元素数据来自于许多个有关联或者无关联的表,然后我们要做的就是将数据呈现在界面上。

10年前大概都是这么干的

直接写一个复杂的SQL语句,返回一个包含所需数据的二维表,然后直接与界面开始绑定。

简单、粗暴。

今天的现状

信息化解决方案的普及,我们接到的企业应用项目很多都是在旧系统无法满足需要的情况下扩展,业务功能也将建立在原来的基础上变得更加复杂。

所以,为了解决系统复杂所带来的困惑,人们开始使用分层架构。

分出数据访问层,使得数据提供得以重用。分出业务逻辑层,使得业务逻辑得以重用。

遇到更加复杂的业务,使得领域驱动设计开始流行,它将更多的业务逻辑内聚在领域模型里面,使得更多的业务逻辑得以重用。

引出了问题

1、许多人使用了ORM工具之后,认为它只能处理简单的功能,或者认为它适合做做界面上只有单个表的增删改,总之认为它不够灵活,其实ORM工具的Model只是一个业务层的东西,不是表现层的Model。

2、碰到这种界面元素复杂的问题,就觉得分层架构根本就是扯淡,有想直接上来一条SQL语句解决问题的冲动。

我们该如何解决

1、界面元素跟单个实体对应的情况。

这种情况在微软官方的DEMO中经常出现,ASP.NET MVC 5+EF6能够自动生成增删改列表3个页面,没什么好说的。

经常容易误导我们,以为MVC中的M指的只是实体类,其实M还可以指实体的服务类,实体的服务类里面包含业务逻辑的处理。

其实M指的是业务逻辑层,不一定只包含单个实体,很可能是多个有关联的实体,或者叫聚合根。

2、界面元素跟多个有关联的实体对应的情况。

这种情况就是上面提到的聚合根,业务层包含一定的逻辑,最后返回一个聚合根给控制器(C)。

视图(View)只需要一个Model就能搞定,强类型使得你很容易就能够点出它的依赖。

让业务层做它该做的事情,别让表现层的Controller抢了业务层的饭碗。

3、更为复杂点的,界面元素跟多个无关联的实体对应的情况。

这种情况下,我们需要创建一个ViewModel,然后用它组合多个无关联的实体。

把握一个原则,业务类对应的是业务模型,ViewModel对应的是每个View。

所以上面两种处理方法只是界面元素简单的情况下减轻工作量的做法,而理论上是需要一个View对应有一个ViewModel。

4、再复杂一点,或者不止一点。

好吧,真的足够复杂的话,那就无视一切理论吧,原生SQL、存储过程、无分层,随便了。

业务逻辑写在数据库,还是写在应用程序,这取决于纵向的负载均衡,需要智慧与经验。

主题是表现层,所以不讨论数据库该不该处理业务逻辑的问题。

总结:

当界面元素比较复杂时,试着创建一个ViewModel来组合业务类去磨平它,而不是去抱怨MVC、ORM、分层架构不够灵活。

本文转载自燕十三的博客

原文标题:表现层的设计(二)——MVC如何处理复杂的界面元素

MVC view页面需要多个model,复杂网页的处理的更多相关文章

  1. Spring MVC 向页面传值-Map、Model和ModelMap

    原文链接:https://www.cnblogs.com/caoyc/p/5635878.html Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndVi ...

  2. Spring MVC 向页面传值-Map、Model和ModelMap https://www.cnblogs.com/caoyc/p/5635878.html

    Spring MVC 向页面传值-Map.Model和ModelMap 除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面创造 使用后面3种方式,都是在 ...

  3. Spring MVC 向页面传值-Map、Model、ModelMap、ModelAndView

    Spring MVC 向页面传值,有4种方式: ModelAndView Map Model ModelMap 使用后面3种方式,都是在方法参数中,指定一个该类型的参数. Model Model 是一 ...

  4. ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...

  5. MVC下 把数据库中的byte[]值保存成图片,并显示在view页面

    MVC下 把数据库中的byte[]值转成图片,并显示在view页面 controller中的action方法 //显示图片[AllowAnonymous]public ActionResult Sho ...

  6. 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面

    在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...

  7. MVC 向页面传值方式总结

    总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传 ...

  8. ASP.Net MVC View

    ASP.Net MVC View(视图)   View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官方默认给出的, ...

  9. 编译 MVC View

    默认MVC的 View页面 不参与编译,当更改view对应model后,view编译也能通过,或者页面有错误的服务端代码时也不会报错. 那么如何在编译的时候能让View中的错误也不能通过呢.经过查找找 ...

随机推荐

  1. 把json数据转化成对象

    把json数据转化到一个对象中,再用对象直接调用 package com.lxj.register; import java.io.BufferedReader; import java.io.IOE ...

  2. 我用 Python 爬了智联“北上广深”5400条 Java 招聘数据

    结论 国际惯例,先上结论. Java 类职位招聘,不论是需求量(工作机会),还是工资平均水平,都是帝都北京最好. 北京和上海的平均工资差距不大(不超过200/月),但上海的需求量是北京的一半,机会更少 ...

  3. 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

    前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...

  4. R in action读书笔记(13)第十章 功效分析

    功效分析 功效分析可以帮助在给定置信度的情况下,判断检测到给定效应值时所需的样本量.反过来,它也可以帮助你在给定置信度水平情况下,计算在某样本量内能检测到给定效应值的概率.如果概率低得难以接受,修改或 ...

  5. 在SQLServer 2005附加SQLServer 2008数据库异常处理

    远程服务器软件系统不算新,数据库是SQL Server 2005.本地开发基本是用新的软件系统.数据库采用SQL Server 2008. 这样在用远程服务器SQL 2005选择附加SQL 2008的 ...

  6. iOS---小经验分享

    1.字符串在block中得赋值 定义一个全局变量,<字符串>当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符创的值.此时字符串应该设置为 ...

  7. iOS Cell异步图片加载优化,缓存机制详解

    最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载, ...

  8. leetcode_894. All Possible Full Binary Trees

    https://leetcode.com/problems/all-possible-full-binary-trees/ 给定节点个数,求所有可能二叉树,该二叉树所有节点要么有0个子节点要么有两个子 ...

  9. Linux之基础命令——文件查看

    cat(连接文件并打印) -n :由 1 开始对所有输出的行数编号. -b :和 -n 相似,只不过对于空白行不编号. -s :当遇到有连续两行以上的空白行,就代换为一行的空白行. [cat a b  ...

  10. CE工具里自带的学习工具--第一关

    点击[下一步],进入第二关