需求描述

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

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. 转】RMySQL数据库编程指南

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Sep 24, 2013 Ta ...

  2. Oracle 的备份和恢复

    Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备 份.导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一. 导出/导入(Export/Import) 利 ...

  3. TabLayout+ViewPager实现标签卡效果

    转载请注明原文地址:http://www.cnblogs.com/yanyojun/p/8082391.html 代码已经上传至Github:https://github.com/YanYoJun/V ...

  4. Python3 动手自己写谷歌翻译

    本篇为实现谷歌翻译的功能,在编写的时候以为只是一个接口的问题. 没想到的是每次翻译都会触发一次JS的执行,在请求参数中生成一个tk. 文中tk的实现是复用的网上大神的代码生成tk. 好了,不说了直接看 ...

  5. parsley.js正确使用姿势

    1.第一式 当然要先引用:parsley.js 2.第二式 页面中定义需要使用自定义校验,注意红色的地方,必须要使用小写,重要的问题说三遍,小写,小写 <form class="for ...

  6. oauth 理解

    单点登录 对授权码模式的解读. 1. 用户访问客户端,客户端将请求认证服务器. 2. 用户选择是否给予客户端授权 3.用户授权后,认证服务器将用户导向客户端事先定义好的重定向的地址,同时会附上一个授权 ...

  7. Jmeter重要组件介绍(一)

    一.常用的取样器 二.常用的逻辑控制器 三.前置处理器 四.后置处理器 五.断言 六.定时器 七.配置元件 八.监听器

  8. 共享win7ip,虚拟机nat模式连接,电脑重启之后,无法连接

    问题原因:VMware NAT Service没有设置为开机启动 解决办法: 1.按win+r,输入services.msc,点击确定: 2.服务窗口中找到VMware NAT Service,双击: ...

  9. go protobuf 编码与解码

    package main import ( "encoding/hex" "fmt" "github.com/golang/protobuf/prot ...

  10. JavaSE-14 异常处理

    学习要点 使用try-catch-finally处理异常 使用throw.throws抛出异常 异常及其分类 log4j记录日志 异常 1  异常的定义 异常是指在程序的运行过程中所发生的不正常的事件 ...