上一节说了一些笼统的东西,这节说一些实际的操作。

1.取列表。这是一个新闻列表:

 

 

 

 

对应MVC的model是:

public class NewsListModel
{
/// <summary>
/// 新闻列表
/// </summary>
public List<Model.ToolNewsInfo> NewsList { get; set; }
}</span></pre>

ToolNewsInfo是三层中的Model,这样,在Controller里面就可以直接使用BLL中的取列表方法:

        [OutputCache(Duration = 600)]
public ActionResult NewsList()
{
var bll = new ToolNews();
var newslist = bll.GetList("select * from ToolNews order by addtime desc ");
Models.NewsListModel model = new NewsListModel();
model.NewsList = newslist;
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> View(model);
}</span></pre>

以上没考虑分页,但取列表本质上是一样的。

2.新增、修改数据。

一般MVC里的Model是这个样子:

public class NewsModel
{
public NewsModel()
{ }
private Guid _id;
private string _title;
/// <summary>
///
/// </summary>
public Guid id
{
set { _id = value; }
get { return _id; }
}
/// <summary>
/// 标题
/// </summary>
[Required(ErrorMessage = "请添写一个标题")]
public string Title
{
set { _title = value; }
get { return _title; }
}
}

有可能牵涉到数据验证,所以在Controller里面不能使用三层的Model。需要把MVC的Model对应字段值传递给多层的Model:

        [HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult EditNews(Models.NewsModel model)
{
if (ModelState.IsValid)
{
var bll = new ToolNews();
var entity = bll.GetModel(model.id); //多层Model
entity.Title = model.Title;
bll.Update(entity); //更新到数据库
}
return RedirectToAction("News");
}

这样就可以实现数据的传递。

不过,表字段少的,可以一一赋值,如果一个表七八十个字段,还要挨个复制,岂不是太苦逼了?程序员最烦复制了。我们的天职是要简化简化再简化。

仔细观察一下这两种Model,发现有一个共性,就是对应数据表字段的属性,名称都是一样的。感谢万能的反射大神,这样我就可以很简单的把一个类相同的属性值复制给另一个类:

 

/// <summary>
/// 把源类中具有 相同属性名的值 赋予目标类
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
public static void CloneSameProperties(object source, object target)
{
PropertyInfo[] sourceProperties = source.GetType().GetProperties();
foreach (PropertyInfo item in sourceProperties)
{
PropertyInfo targetProperty = target.GetType().GetProperty(item.Name);
if (targetProperty != null)
{
targetProperty.SetValue(target, item.GetValue(source, null), null);
}
}
}

这样Controller里的代码可以升级为:

[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult EditNews(Models.NewsModel model)
{
if (ModelState.IsValid)
{
var bll = new ToolNews();
ToolNewsInfo entity = new ToolNewsInfo(); //多层Model
ObjectPlus.CloneSameProperties(model, entity);
bll.Update(entity); //更新到数据库
}
return RedirectToAction("News");
}

如此,数据操作就都可以走多层来实现。

如何让MVC和多层架构和谐并存(二)的更多相关文章

  1. 如何让MVC和多层架构和谐并存(一)

    MVC的架构和多层架构,在ORM框架上是不兼容的.MVC的数据库操作需要通过实体框架Entity Framework,多层的数据库操作需要通过DAL层.我们最近刚完成的项目,实现了MVC和多层的并存, ...

  2. 转载Mvc的多层架构

    Mvc的多层架构 分享一个Mvc的多层架构,欢迎大家拍砖斧正   多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有 ...

  3. Mvc的多层架构

    分享一个Mvc的多层架构,欢迎大家拍砖斧正   多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有一句话是比较有代表 ...

  4. 分享一个MVC的多层架构,欢迎大家拍砖斧正

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策 ...

  5. 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER

    最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...

  6. MVC 5 Scaffolding多层架构代码生成向导开源项目

    asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与)   Visual Studio.net 2013 asp.net MVC 5 Scaffolding代码 ...

  7. 【转】浅谈MVC与三层架构

    首先给大家引入下MVC的概念: MVC(Model View Controller)模型.视图以及控制器,它是一种较为广泛应用的结构设计模式. 模型:就是在MVC设计模式中需要被显示的数据.在通常情况 ...

  8. .NET跨平台之mac 下vs code 多层架构编程

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入,申请备注填写姓名+技术+工作年限) Q  Q:408365330     E-Mail:eg ...

  9. MVC与三层架构的区别

    我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. ...

随机推荐

  1. 牛客寒假算法基础集训营1 D 小a与黄金街道

    链接:https://ac.nowcoder.com/acm/contest/317/D 首先被数学题吓到了.gcd(n,x)==1 那么必定有 gcd(n,n-x)==1 证明略. 并且两个人的对答 ...

  2. kuangbin专题十二 HDU1078 FatMouse and Cheese )(dp + dfs 记忆化搜索)

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. MYSQL查询字段全部为中文的字段

    在实际使用mysql的过程中,会遇到这样的问题,查询字段内容全部为中文内容的数据,对于刚用mysql的小伙伴可能就比较迷失了,不知道怎么使用,其实这个问题很简单,使用下面这个sql语句就可以了 SEL ...

  4. 安装 zookeeper

    https://www.w3cschool.cn/zookeeper/zookeeper_cli.html ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个 ...

  5. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_IL和验证

    1.IL 基于栈——所有指令压入一个执行栈,并从栈弹出结果. 2.IL 指令无类型——指令会判断栈中操作数的类型,并执行恰当的操作. 3.IL 最大优势——应用程序的健壮性和安全性. 将 IL 编译成 ...

  6. C# web项目添加*.ashx文件后报错处理

    说明:我是菜鸟,博文水平有限,仅作学习过程中的备忘笔记 1.截图信息: ———————————————————————————————————————————————————————————————— ...

  7. AJAX使用说明书 基础

    AJAX简介 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异 ...

  8. 第四章 Appium真机运行测试用例讲解

    -----手机自动化之Appium 手机自动化测试用例虽然可以在模拟器上运行,可是模拟器毕竟和真机还是有区别的.在第二章我们讲到了模拟器上运行测试用例后,我又花了两天的时间,研究了一下真机运行测试用例 ...

  9. Docker & ASP.NET Core 教程

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 第五篇: Docker & ASP.NET Core (5):Docker Compose AS ...

  10. 进入wordpress中的模板文件

    Wordpress的页面结构 一个简单的wordpress由 头部.内容.页脚组成,每个块中的每一个都由当前wordpress主题中模板文件生成. eg: 头:包含重要的信息,一般都是网页的头部. 内 ...