MVC KT
- 1. ASP.NET MVC 请求流的通用步骤:
Step 1:首先获取控制器。
Step 2:依赖行为控制器创建Model对象,Model通过转换调用数据访问层。
Step 3:数据填充Model之后,传递到View 显示层,实现显示的目的。
public string GetSky()
{
return "sky" +"<br> is a boy </br>"; //直接可以返回字符串与Html 编码
}
public string GetUser()
{
User u = new User();
u.UserID = "100";
u.UserName = "sky";
return u.ToString(); // 也可以直接返回对象
}
public ActionResult GetView()
{
return View("SkyView"); // 也可以返回页面
}
- 2. View函数的功能是什么?
创建 ViewResult 对象将会渲染成视图来给用户反馈
- ViewResult 创建了ViewPageActivator 对象
- ViewResult 选择了正确的ViewEngine,并且会给ViewEngine的构造函数传ViewPageActivator对象的参数
- ViewEngine 创建View类的对象
- ViewEngine 调用View的RenderView 方法。
ActionResult和 ViewResult的关系是什么?
ActionResult是抽象类,而ViewResult是ActionResult的多级孩子节点,多级是因为ViewResult是ViewResultBase的子类,而ViewResultBase是ActionResult的孩子节点
什么是ContentResult?
ViewResult是HTML响应而ContentResult是标准的文本响应,仅返回字符串类型。区别就在于ContentResult是ActionResult的子类。
ViewBag可以称为ViewData的一块关于语法的辅助的糖果,ViewBag使用C# 4.0的动态特征,使得ViewData也具有动态特性。
ViewData与ViewBag对比:
ViewData |
ViewBag |
它是Key/Value字典集合 |
它是dynamic类型对像 |
从Asp.net MVC 1 就有了 |
ASP.NET MVC3 才有 |
基于Asp.net 3.5 framework |
基于Asp.net 4.0与.net framework |
ViewData比ViewBag快 |
ViewBag比ViewData慢 |
在ViewPage中查询数据时需要转换合适的类型 |
在ViewPage中查询数据时不需要类型转换 |
有一些类型转换代码 |
可读性更好 |
ViewBag内部调用ViewData。
.cs
public ActionResult GetBagView()
{
User u = new User();
u.UserID = "300";
u.UserName = "sky300";
ViewBag.User = u;
return View("BagView");
}
CSHTML
@{
_001HelloWorld.Controllers.User emp = (_001HelloWorld.Controllers.User)ViewBag.User;
}
强类型模型,和@model关键字
我们之前有讲过ViewBage是一个动态对象,可以把数据或对象从Controller传递到View中。
ASP.NET MVC同样提供了强类型(strongly typed data)到view template.这种强类型,VS 这种脚手架机制(scaffolding mechanism),在Controller的Methods中和View Template的Views中都有体现。
现在我们先来看看Controller中自动生成的code
// GET: /Movies/Details/
//以下方法,从实例化后的Movie对象中读取Movie数据
public ActionResult Details(int id = 0)
{
//如果id对应的Movie找到,则Return到Detail.cshtml中
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
然后转到View 中的Details.cshtml看一下,第一行:
@model MVCMovie.Models.Movie //没有分号。。。。
Detail.cshtml最上面的这一行的声明(Statement),指定了object是View可以接受的类型
@model指令,对Model对象强制类型转换,把Controller从Model中获取的数据传递到View Template中 中,仅仅接受这一个Model
设置强类型的View是最佳解决方案。 @model 这是一个语法。
是否能将View设置为多个Model使用的强类型?
不可以,实际项目中在一个View中想要显示多个Model时以点结束的,而数据是存放在大的Model中的。
理解ASP.NET MVC 中的View Model
实验5中已经违反了MVC的基本准则。根据MVC,V是View纯UI,不包含任何逻辑层。而我们在实验5中以下三点违反了MVC的体系架构规则。
1. 附加姓和名显示全名——逻辑层
2. 使用货币显示工资——逻辑层
3. 使用不同的颜色表示工资值,使用简单的逻辑改变了HTML元素的外观。——逻辑层
ViewModel 解决方法
ViewModel是ASP.NET MVC应用中隐式声明的层。它是用于维护Model与View之间数据传递的,是View的数据容器。
Model 和 ViewModel 的区别
Model是业务相关数据,是根据业务和数据结构创建的。ViewModel是视图相关的数据。是根据View创建的。
具体的工作原理
- Controller 处理用户交互逻辑或简单的判断。处理用户需求
- Controller 获取一个或多个Model数据
- Controller 决策哪个View最符合用户的请求
- Controller 将根据Model数据和View需求创建并且初始化ViewModel对象。
- Controller 将ViewModel数据以ViewData或ViewBag或强类型View等对象传递到View中。
- Controller 返回View。
View 与 ViewModel 之间是如何关联的?
View将变成ViewModel的强类型View。
Model和 ViewModel 是如何关联的?
Model和ViewModel 是互相独立的,Controller将根据Model对象创建并初始化ViewModel对象。