MVC
Model-View- Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
其运作原理如下图:
Controller
控制器,是用来处理业务的,可以处理用户的请求,调用数据层,处理业务,并将数据传给视图。例如:
#region 2.Action方法(可以看成MVC设计模式的Model)+ ActionResult Index2()
//2.Action方法(可以看成MVC设计模式的Model)
public ActionResult Index2()
{
System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
//2.1处理当前业务(比如读取数据库,判断等)
//2.1.1创建一个数据集合(伪数据),获取数据
List<Models.Dog> list = InitData();
//2.1.2遍历集合,生成html代码,存入sbHtml
list.ForEach(d =>
{
sbHtml.AppendLine("<div>" + d.ToString() + "</div>");
});
// ViewBag.Message = "修改此模板以快速启动你的 ASP.NET MVC 应用程序。";
//2.1处理当前业务(比如读取数据库,判断等)
//2.2使用ViewBag传输数据给 同名 Index.cshtml视图
//viewbag是以 dynamic类型集合,可以动态的添加任意类型的任意名称的属性和值
ViewBag.HtmlStr = sbHtml.ToString();//HtmlStr为任意名称
//2.3 加载同名视图Index.cshtml
return View();
}
/// <summary>
/// 数据上下文对象
/// </summary>
OumindBlogEntities db = new OumindBlogEntities();
#region 0.2查询 文章 列表 + ActionResult Index()
/// <summary>
/// 查询 文章 列表
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
//1.查询 数据库里的 文章数据(通过 EF 执行)
try
{
List<Models.BlogArticle> list = (from d in db.BlogArticles where d.AIsDel == false select d).ToList();
//2 将集合数据传给视图
//ViewBag.DataList = list;//自定义属性方式
ViewData["DataList"] = list;//使用键值对的方式
//3.加载视图
return View();
}
catch (Exception ex)
{
return Content("请刷新页面~~~~" + ex.Message);//用来输出提示内容
}
}
对了,另外指出,View中可以传字符串,也可以传Model。如果是传字符串,作用就是上面说的跳转指定视图的功能。如果是传的Model,则是将model返回到当前action多对应View的视图上去。在View页面上可以接受视图。
通过上面我们还可以了解到如何将数据传递给View,这里有三种方法:
#region 0.4显示要修改的数据 + ActionResult Modify(int id)
[HttpGet]//设置方法标记
/// <summary>
/// 0.4显示要修改的数据
/// </summary>
/// <param name="id">要修改的文章的id</param>
/// <returns></returns>
public ActionResult Modify(int id)
{
//1.根据id 查询数据库,返回的集合中 拿到 第一个 实体对象
BlogArticle art = (from a in db.BlogArticles where a.AId == id select a).FirstOrDefault();//获取list中的第一个对象
//2.生成 分类 下拉框 列表集合 <option value="1">文本</option>
//隐式转换成SelectListItem
IEnumerable<SelectListItem> listItem = (from c in db.BlogArticleCates
where c.IsDel == false select c).ToList()
.Select(c=> new SelectListItem { Value = c.Id.ToString(), Text = c.Name });
//Linq语句不支持其它方法,只允许有属性
//将生成的文章分类 下拉框选项集合 设置给 ViewBag
ViewBag.CateList = listItem;
//2.将 art 传递 给 视图显示
//ViewBag 设置属性
//第一种方法:通过ViewBag集合传输
//viewbag是以 dynamic类型集合,可以动态的添加任意类型的任意名称的属性和值
ViewBag.HtmlStr = sbHtml.ToString();//HtmlStr为任意名称
//第二种方法:通过ViewData容器传输
//ViewData:是一个字典容器,可以将控制器的数据传递给页面
ViewData["DataList"] = list;//使用键值对的方式
//第三种方法:通过Model传输
BlogArticle art = (from a in db.BlogArticles where a.AId == id select a).FirstOrDefault();//获取list中的第一个对象
//*“加载”视图*使用 View的构造函数, 将 数据 传给 视图上的 名为 Model 的属性
return View(art);
}
View
视图,主要是将Controller传回来的值显示给用户,是简洁的HTML页面。获取数据的方法(与controller传输对应):
//第一种ViewBag显示数据
@ViewBag.CateList //Controller给ViewBag设定的什么属性,就调用什么属性,其中的数据就会显示出来
//第二种ViewData显示数据
@ViewData["Key1"] //Controller为ViewData设置的键值对,找到对应的键,则对应的值同样会显示出来
//第三种Model显示数据
//在View视图的开头,需要先引入Model类型
@model MVCBlog.Models.BlogArticle //Model类型是BlogArticle类型
@Html.TextAreaFor(a => a.AContent,10,60,null) //则其中的a就是Model模型——BlogArticle的模型实体
甚至在视图上提交的表单,会自动将前台页面数据装配到控制器中(表单中Name属性与参数相同的action中,无论是复杂的,还是简单的参数)
//Controller中
public ActionResult Index(string txtName,string txtPwd,UserInfo userInfo){}
//View页面
<form id="form1" method="post" action="" enctype="application/x-www-form-urlencoded"><!--如果没有输入action,则从哪来回哪去-->
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="txtName" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="txtPwd" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交" />
</td>
</tr>
</table>
</form>
Model
模型,与数据库打交道,与之前我们学到的Model有相同,但也不同。相同的是,这里也是实体模型。但不同的是,这里的视图是对应数据库表的,当然也可以自己创建实体类,并且还进行与数据库交互的功能。与数据库的交互可以通过EF自动生成模型,并且还能自动生成关系图,更加方便直接,甚至如果表中存在外键,也能直接生成外键属性,极大的方便了我们进行级联操作。例如BlogArticle
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码已从模板生成。
//
// 手动更改此文件可能导致应用程序出现意外的行为。
// 如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------
namespace MVCBlog.Models
{
using System;
using System.Collections.Generic;
//EF 按照模型生成的实体类
public partial class BlogArticle
{
public int AId { get; set; }
public int ACate { get; set; }
public int AAuthor { get; set; }
public string ATitle { get; set; }
public string AContent { get; set; }
public string AImgsrc { get; set; }
public int APlnum { get; set; }
public bool AAllowPL { get; set; }
public bool AIsTop { get; set; }
public string ATag { get; set; }
public int ACick { get; set; }
public int AStatu { get; set; }
public System.DateTime AAddtime { get; set; }
public System.DateTime AUpdatetime { get; set; }
public bool AIsDel { get; set; }
public string AHtmlSrc { get; set; }
//三个 外键属性
public virtual BlogArticleCate BlogArticleCate { get; set; }
public virtual BlogUser BlogUser { get; set; }
public virtual Enumeration Enumeration { get; set; }
}
}
总结MVC
1、约定大于规定
2、耦合性低
3、重用性高
4、可维护性高
5、部署快
6、视图与控制器间的过于紧密连接
7、视图对模型数据的低效率访问