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
2
3
4
5
6
7
8
9
10
11
Cat cat = new Cat()
{
Name="TEST",
Age=100
};
return View(cat);
前台
@{
Cat cat = Model as Cat;
}
@cat.Name-----@cat.Age

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
2
3
4
5
6
@helper A(string a, string b)
{
<h1>@A+@b<h1>
}
//使用
@A("a", "b") /*输出 a+b*/

09.分部视图引用

1
2
3
4
5
@Html.Partial("PartialViewName")
@{ Html.RenderPartial("PartialViewName"); }
//Partial有返回值MvcHtmlString;RenderPartial没有返回值
//Partial是将视图内容直接生成一个字符串并返回,RenderPartial方法是直接输出至当前HttpContext
//return PartialView()不会执行 _ViewStart.cshtml

0x03.路由规则–2018 年 3 月 30 日

01.mvc 程序第一次启动时,会执行 Global.asax 文件中 Application_Start()方法,调用 RouteConfig.RegisterRoutes()注册好的路由规则 02.路由的主要作用是,mvc 会根据路由规则来解析 url,以确定由哪个 Controller-action 执行 03.创建以及默认路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//001.在App_Start文件夹中新建RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoute(RouteCollection routes)
{
//忽略对.axd文件的路由
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "default",
url: "{controller}/{action}/{id}",
default: new {controller = "Home", action = "Index", id = UrlParameter.Optional} //id表示可选参数;程序会默认加载Home控制器下的Index方法
);
}
}

//002.在Global文件中注册路由
//在Application_Start()方法中添加 RouteConfig.RegisterRoutes(RouteTable.Routes);

//003.路由约束
//在MapRoute方法中添加
//contraints: new{ id= @"\\d+"} //约束当前路由规则的id参数只能是数字
//namespaces: new string[] {"namespaceName"} //会去指定的命名空间下查找对应的控制器

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Remote("Check", "Home", ErrorMessage = "当前名字已存在,请更换一个", HttpMethod = "POST")]
public string Name{ get; set;}

public ActionResult Check()
{
string name = Request["Name"];
if(name == "A")
{
return Content("false"); //说明:返回false说明此name已存在,此name不可用
}
else
{
return Content("true"); //此name可用
}
}

08.Rang:约束数值型类型的数值范围、可以是 int/double
09.DataType:标示附加的类型

1
2
3
4
5
6
7
8
9
10
11
public class DataTypeDomo
{
[DataType(DataType.Text)]
public string Name{get; set;}
[DataType(DataType.Password)]
public string password{get; set;}
[DataType(DataType.PhoneNumber)]
public string PhoneNumber{get; set;}

}

10.错误信息提示:

1
(ErrorMessage = "tishi") //可以使用{0},{0}会使用当前属性的属性名

11.自定义注解:
所有的注解都派生自基类 ValidationAttribute,一个抽象类,在命名空间 System.ComponentModel.DataAnnotaticns 下。需要重写基类中提供的 IsValid 方法的其中一个版本。

1
2
3
4
5
///参数1是要验证的对象的值
protected override ValidationResult IsValid(object obj, ValidationContext validationContext)
{
return ValidationResult.Success;
}

0x05.区域

区域位于项目主站 Areas 文件夹中
区域下都有一个继承自 AreaRegistration 的子类,假设区域名称叫”Study”,其重写了两个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace xx
{
public class StudyAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Sdtdy";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Study_default",
"Study/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}

0x06.过滤器

方法 说明 执行顺序
OnAuthentication 认证 1
OnAuthorization 授权 2
OnActionExecuting 方法执行之前 3
OnActionExecuted 方法执行之后 4
OnResultExecuting 结果返回之前 5
OnResultExecuted 结果返回之后 7
View() 6