Main
Main
文章目录
  1. 0x00.控制器约定
  2. 0x01.四种传值方式
  3. 0x02.Razor视图
  4. 0x03.路由规则–2018年3月30日
  5. 0x04.ActionResult子类
  6. 0x05.模型注解
  7. 0x05.区域
  8. 0x06.过滤器

MVC.NET 学习笔记

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
[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
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
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
支持一下
  • 微信扫一扫
  • 支付宝扫一扫