需求描述

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

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. Android开发学习——开发调试工具-DDMS应用,ADB进程,Logcat,Eclipse Debug调试

    DDMS --  Dalvik debug monitor service    调试监控服务 对模拟器进行相关配置. ADB进程   Android debug bridge  建立eclipse和 ...

  2. Win10 UWP开发:摄像头扫描二维码/一维码功能

    这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...

  3. web页面打印--铺满A4

    css <style type="text/css"> body { margin: 0; padding: 0; background-color: #FAFAFA; ...

  4. jQuery addClass removeClass toggleClass方法概述

    通过动态改变类名(class),可以让其修改元素呈现出不同的效果.在HTML结构中里,多个class以空格分隔,当一个节点(或称为一个标签)含有多个class时,DOM元素响应的className属性 ...

  5. (转)淘淘商城系列——发布dubbo服务

    http://blog.csdn.net/yerenyuan_pku/article/details/72758639 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入, ...

  6. Oracle中的执行计划

    使用autotrace sqlplus系统参数:SQL> set autotrace trace onSQL> select * from dual;DUM---XExecution Pl ...

  7. 安装gitlab并配置邮箱

    安装要求:运行内存必须大于等于2G 一.安装docker wget -qO- https://get.docker.com/ | sh 镜像加速: echo '{"registry-mirr ...

  8. Java B

    3.继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 答:父类: package test; public class FatherClass { public FatherClass( ...

  9. org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [********] will not be managed by Spring

    如下图,查看层次是否正确.

  10. jstl笔记

    EL函数库 <%@page import="java.util.ArrayList"%> <%@ page language="java" c ...