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

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. APP设计规范

    设计师DPI指南 本指南旨在为初级到中级设计人员提供“入门”或介绍性阅读,他们希望从一开始就学习或获得有关跨DPI和跨平台设计的更多知识. 尽可能少的数学和没有不可解析的图形,只需在简短的部分中订购直 ...

  2. java经典学习路线

    恩,做开发的工作已经三年多了,说起来实在是惭愧,自己的知识树还像一棵小草一样,工作中使用到了许多的知识和技术,不过系统性不够.根基不牢.并且不够深入!当然,慢慢的我也更加的清楚,我需要学习一些什么样的 ...

  3. HDU-Big Number (斯特林公式)

    In many applications very large integers numbers are required. Some of these applications are using ...

  4. P1029 最大公约数和最小公倍数问题(思维题)

    题目描述 输入22个正整数x_0,y_0(2 \le x_0<100000,2 \le y_0<=1000000)x0​,y0​(2≤x0​<100000,2≤y0​<=100 ...

  5. linux 安装 配置网络 备份 快照

    安装系统准备: 1.软件准备 vmware workstation14.vm14key.centos系统镜像 secureCRT http://sw.bos.baidu.com/sw-search-s ...

  6. [CF1051F]The Shortest Statement (LCA+最短路)(给定一张n个点m条有权边的无向联通图,q次询问两点间的最短路)

    题目:给定一张n个点m条有权边的无向联通图,q次询问两点间的最短路 n≤100000,m≤100000,m-n≤20. 首先看到m-n≤20这条限制,我们可以想到是围绕这个20来做这道题. 即如果我们 ...

  7. Go语言基础练习题系列2

    1.练习1 生成一个随机数,让一个用户去猜这个数是多少? 代码示例如下: package main import ( "fmt" "math/rand" //m ...

  8. 关于 java中的SecureRandom在linux中每次生成不同结果

    使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密 public static String encrypt(String content, ...

  9. 搜索提示(search suggest)文献阅读

    Learning to Personalize Query Auto-Completion 样本 正例用用户的sug点击,其余是负例 特征 用户历史特征: query历史频次,候选和用户历史输入的ng ...

  10. Android中的时间格式的校验

    public class MainActivity extends Activity implements OnClickListener{ private Button btn1; private ...