MVC(Model-View-Controller)
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。- View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。- Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。(百度百科)
0x00.控制器约定
- 必须以 Controller 结尾
- 控制器下的 Action 方法一定是 Public,否则回报 404
- action 对应的页面是:views 下面和控制器同名文件夹下和 action 同名的视图
0x01.四种传值方式
- ViewData
后台: ViewData[“TEST1”] = “TEST1”;
前台(cshtml):ViewData[“TEST1”] = @ViewData[“TEST1”]- ViewBag(实际上是通过 ViewData 来传递,所以相同 key 的值会被覆盖)
后台: ViewBag.TEST2 = “TEST2”;
前台(cshtml):ViewBag.TEST2 = @ViewBag.TEST2- TempData
后台:TempData[“TEST3”] = “TEST3”;
前台(cshtml):TempData[“TEST3”] = @TempData[“TEST3”]- View()
1 | Cat cat = new Cat() |
0x02.Razor 视图
01.扩展名:cshtml
02.@:Razor 语法, 在@{}中所写的代码都是 c#代码 03.强类型视图:指定当前 view 使用某个实体对象
04._layout.cshtml
- 001.整个网站的布局,相当于 asp.net 中的母版页。
- 002.@RenderBody(),布局页的占位符,会被子页面中的内容替换。
- 003.@Styles.Render(“某虚拟路径名”) 作用,根据虚拟路径名查找物理路径对应的 css 文件
- 004.@Scripts.Render(“某虚拟路径名”) 作用,根据虚拟路径名查找物理路径对应的 js 文件
- 005.003 和 004 使用的条件是,存在 BundleConfig.cs 文件并在 Global.asax 文件中注册过。优点是,压缩 css 和 js 文件的大小
- 006.RenderSection(“scripts”, required: false) RenderSection 所定义的标签可以被子页面重写,如果 required 为 true,则子页面必须重写,否则可以重写,也可以不重写。
05._viewstart.cshtml
- 001.此文件的作用是,将_layout.cshtml 文件自动加载到所有的.cshtml 文件中。当然如果页面指定了@{layout=null},则不会加载
- 002.如果 Views 文件夹下的文件夹下也存在_layout.cshtml,则加载顺序是 Views 文件夹下的_layout.cshtml–>Views 文件夹下的文件夹下的_layout.cshtml
06.移除 aspx 视图引擎:MVC 使用两套视图引擎,排序为 1.aspx 2.razor
移除方法,在 Global.asax 文件的 Application_Start()方法中添加 ViewEngines.Engines.Remove(0); 即可
07.HtmlHelper 扩展
扩展 HtmlHelper:三要素 静态类、静态方法、this 关键字。最后将命名空间改成 System.Web.Mvc,目的是为了防止重复引入命名空间
08.@helper 扩展
在.cshtml 文件中使用。类似 C#中方法的定义、js 中定义 function
定义如下:
1 | @helper A(string a, string b) |
09.分部视图引用
1 | @Html.Partial("PartialViewName") |
0x03.路由规则–2018 年 3 月 30 日
01.mvc 程序第一次启动时,会执行 Global.asax 文件中 Application_Start()方法,调用 RouteConfig.RegisterRoutes()注册好的路由规则 02.路由的主要作用是,mvc 会根据路由规则来解析 url,以确定由哪个 Controller-action 执行 03.创建以及默认路由
1 | //001.在App_Start文件夹中新建RouteConfig.cs |
0x04.ActionResult 子类
01.ViewResult() –> 返回想返回的视图。
02.ContentResult() –> 返回内容、不需要有对应的视图
03.JsonResult() –> 可以用作 ajax 请求,如果是 get 请求则一定要在 Json()中写入 JsonRequestBehavior.AllowGet
04.HttpStatusCodeResult() –> 用户自己设置需要相应的状态码
05.JavaScriptResult() –> 配合视图中用
06.FileResult() –> 文件的操作,如下载,验证码等
07.RedirectResult() –> 执行页面跳转。本质在响应报文头中产生了 Location:路径的命令
08.RedirectToRouteResult() –> 使用某路由规则进行跳转
0x05.模型注解
01.Required:可以现实对视图页面上对应的模型特性属性文本框进行非空验证
当属性为空或者为 null 时,会引发一个验证错误
02.StringLength:约束属性值的长度
[stringLength(160, mininumlength=3)]表示至少输入 3 个字符,最多 160 个字符才有效
03.DisplayName:在视图上可以利用@Html.DisplayName() @Html.DisplayNameFor() @Html.LabelFor 来显示具体的值
04.Compare:将当前度假了此特性的属性值与目标值比对
05.RegularExpression:使用正则表达式来对属性值进行约束
06.DataType:标示附加的类型
07.Remote:实现对当前属性值内容的检查。通过 ajax 请求验证
1 | [ ] |
08.Rang:约束数值型类型的数值范围、可以是 int/double
09.DataType:标示附加的类型
1 | public class DataTypeDomo |
10.错误信息提示:
1 | (ErrorMessage = "tishi") //可以使用{0},{0}会使用当前属性的属性名 |
11.自定义注解:
所有的注解都派生自基类 ValidationAttribute,一个抽象类,在命名空间 System.ComponentModel.DataAnnotaticns 下。需要重写基类中提供的 IsValid 方法的其中一个版本。
1 | ///参数1是要验证的对象的值 |
0x05.区域
区域位于项目主站 Areas 文件夹中
区域下都有一个继承自 AreaRegistration 的子类,假设区域名称叫”Study”,其重写了两个方法
1 | namespace xx |
0x06.过滤器
方法 | 说明 | 执行顺序 |
---|---|---|
OnAuthentication | 认证 | 1 |
OnAuthorization | 授权 | 2 |
OnActionExecuting | 方法执行之前 | 3 |
OnActionExecuted | 方法执行之后 | 4 |
OnResultExecuting | 结果返回之前 | 5 |
OnResultExecuted | 结果返回之后 | 7 |
– | – | – |
View() | – | 6 |