ASP.NET MVC开发基础

1、Controller(类)

  • 控制器(类)名必须以Controller结尾
  • 必须继承Controller抽象类
  • 必须是public的

2、Action(方法)

  • 方法必须是public的
  • 方法不能加[NoAction]特性
  • controller中方法不能直接重载,重载的方法需要通过特性区分

image-20200226134350670

  • 判断请求类型还可以通过以下语句

    if("get".Equals(Request.HttpMethod,StringComparison.CurrentCultureIgnoreCase))

  • 通过特性给action取别名:[ActionName(“别名”)]

3、Controller默认代码

1
2
3
4
public ActionResult Index()
{
return View();
}

3.1、View() 是什么

View()方法是从Controller类继承下来的方法,有以下8个重载(若返回视图,都不会指定后缀名)

  1. View() : 返回与Action名相同的视图文件。假设控制器为Account,Action为UserList,,View()等价于View(“UserList”)

  2. View(Object)文件查找同上,将Model传递到页面

  3. View(String)呈现指定的视图文件,(可以传名称或具体路径,名称必须不带后缀名,路径必须带后缀名)

  4. View(IView)呈现自定义的视图

  5. View(String, Object) 在指定的页面传递Model对象

  6. View(String, String)在视图页面使用母版页,第二个参数为母版页的路径

  7. View(IView, Object)在自定义视图中传递Model对象

  8. View(String, String, Object)是在使用母版页的视图中传ModelI对象

    默认文件查找顺序

3.2、ActionResult是什么

ActionResult是一个抽象类

Action方法必须返回ActionResult类型吗?实际上可以返回任何有效的数据类型

ActionResult的子类:

  1. System.Web.Mvc.ContentResult :返回一串字符串
    示例: return Content(“ASP.NET MVC”);

  2. System.Web.Mvc.EmptyResult :返回空内容
    示例: retum new EmptyResult();

  3. System.Web.Mvc.FileResult :返回一个文件,典型应用:制作验证码

    System.Web.Mvc. FileContentResult
    示例: retum new FileContentResul(new byte[1024], “image/jpeg”);

    System.Web.Mvc. FilePathResult
    示例: returm new FilePathResul(“logo jpg”, “image/ipeg”);

    System.Web.Mvc.FileStreamResult
    示例: return new FileStreamResult(new FileStream(“logo.jpg”, FileMode.Open), “image/jpeg”);
    总结:可以使用File()方法完成对上面三个子类的使用

  4. System.Web.Mvc.HttpUnauthorizedResult :未经授权的请求结果
    示例: returm new HttpUnauthorizedResult();

  5. System.Web.MvcJavaScriptResult :返回JS脚本
    示例: return JavaScript(““);

  6. System.Web.Mvc.JsonResult :返回Json格式,常用于Ajax的应用【ajax】
    示例: retum Json(new {Name=”jack” ,Age=20 }, JsonRequestBehavior.AllowGet);

  7. System.Web.Mvc.RedirectResult :重定向站内或站外
    示例: retum Redirect(“url”);

  8. System.Web.Mvc. RedirectToRouteResult :站内请求
    示例: return RedirectToAction(“Login”); //根据控制器和Action
    return RedirectToRoute(“Defaul”); //根据路由名称

  9. System.Web.Mvc.ViewResultBase:返回视图

    System.Web.Mvc. PartialViewResult :部分视图
    示例: return PartialView(“~/Views/Account/UserLogin.ascx”);

    System.Web.Mvc.ViewResult :视图结果
    示例: return View(“ -/Views/Account/UserLogin.aspx”);

    区别: PartialViewResult和ViewResult都能返回动态视图,两者使用的方式是一样的
    只能从逻辑上区分。部分视图用于嵌入到视图页面,部分视图通常返回用户控件

4、URL匹配模式

4.1、routes.MapRoute()方法有什么用?

映射指定的URL路由。是类RouteCollection的扩展方法。

4.2、该怎么用?

方法参数解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
-----------------------------------------------------
this RouteCollection routes: MapRoute()方法的扩展类

string name:路由名称,名称必须唯一. 不能有相同的路由名称,可以为null(可以通过路由name获取路由)

string url: URL模式(例如 url: "Student/{controller}/{action}/{id}")

Object defaults:占位符的默认值,在含有字面量的url模式中,字面量前面的默认值没用(特别注意默认值的特殊符号,如-)。

Object constraints:占位符数据约束
urt "controller/{action}/{age}",要求: age必须是数字,第一位不能为零,其它形式视为无效,约束的写法:constraints:new { age= @"[1-9]]|\d{2}" } 一位或是两位数字都是有效的

string[] namespaces: 命名空间,解决控制器名相同导致的错误
----------------------------------------------------
/*
URL组成:
字面量:固有的字符串,例如Student
占位符:用于获取url信息的一个标识符,也可称为变量名,例如{controller}
注意:{controller}和{action}必须要有,出现位置不限,是MVC约定的名称。URL中要特别注意空格。
分隔符:/
特殊的匹配符:*,匹配剩余的部分,一般放在最后的参数,如url:“{controller}/{action}/{*name}”,访问url为 admin/login/a/b/c,则name=a/b/c。贪婪匹配规则:优先匹配完前面的占位符的所有可能性,再匹配后面的占位符
无效的URL格式:不能以/或~字符开头,不能有?,占位符不能连续。
*/

路由从上到下搜索,越放在前面,优先级越高。建议:通用的URL放在最前面,具体越详细的URL放到最后面

5、获取客户端的数据

5.1、表单数据

Request.Form[“name”],根据表单中元素的name属性获取其value

5.2、URL上的数据

Request.QueryString[“name”],获取url中的参数

IE地址栏输入中文会导致获取到的数据乱码(需要改变全局的编码格式为gb23312)

5.3、路由数据

object obj=RouterData.Values[“name”]

5.4、方法上的参数

public ActionResult Register(string name),可映射为表单元素、URL参数、路由数据
如果有name有冲突,优先级顺序是:表单元素>路由数据>URL参数

获取时,可以使用name,(string name)必须与要获取的数据name同名

注意:对于方法的参数如果是非空类型的,例如int ,没有传递相应的值会引发异常。(解决的方法就是使用参数默认值int age=0 )

6、控制器传递数据到视图

6.1、ViewBag和ViewData

ViewBag是dynamic类型
例如: ViewBag.dataName= “ASP.NET MVC”(类似于Python中的弱类型)

ViewData是Object类型
例如: ViewData[“ dataName”]= “Hello ASP.NET”

ViewBag和ViewData操作的是同一个数据源,如果添加的key相同则覆盖,例如:ViewBag.age和ViewData[“age”]是相同的。建议:在同一个项目两者中选一个比较好

特点:生命周期比较短,重定向后数据销毁(丢失),作用于ViewResult指向的视图

6.2、TempData

保存的机制是Session ,跳转是将数据保存到Session ,进入控制器从Session移除

重定向后数据不会丢失

使用赋值 TempData[“name”]=value;

6.3、强类型视图

6.3.1、控制器参数为Model类型

public ActionResult Register(Student student),会将提交的表单映射成Model,表单中所有控件的name必须与Model的属性一一对应【不区分大小写!】

6.3.2、Return View(Model对象)
6.3.3、定义视图Model的类型

声明:Razor视图

​ 单个model使用:@model MVC_Models.Models.Movie

​ model集合使用:@model IEnumerable<MVC_Models.Models.Movie>

6.3.4、页面获取model数据的方式
  • @Model.StudentName;,只用于显示,不能给model赋值,StudentName为属性的名称
  • @Html.TextBox(“StudentName”);,适用于表单元素,能够赋值给model,StudentName为属性的名称,不区分大小写
  • @Html.TextBox(“stu.StudentName”);,stu为Action的参数名,StudentName为属性的名称,不区分大小写。这种方式适用于表单元素,能够赋值给Model,注意初始化的内容不会显示
6.3.5、数据绑定

通过Bind特性设置Model绑定的方式

Bind是BindAttribute别名,需要引用命名空间System.Web.Mvc

有三个重要的属性
Exclude :不进行模型映射的操作,这些属性获取不到表单提交的数据,多个属性之间用逗号(,)隔开;
Include :进行模型映射的操作,这些属性能得到表单提交的数据,多个属性之间用逗号(,)隔开
Prefix : Model使用前缀

Bind特性只用于Model类和Action的参数上起作用:

  • 在Model类上设置,不过Prefix在这里的设置是无效的
  • 在Action的参数上,视图上必须使用Prefix指定的前缀名作为属性的前缀(针对list也有效)
  • 不建议在Model类上做绑定,而是在Action的参数上做绑定

自定义绑定器(使用概率比较少) //不想学所以没学

7、表单数据验证

7.1、验证规则写在哪里

在Model类的属性上编写

7.2、如何编写使用验证规则

  1. 引入组件System.ComponentModel.DataAnnotations

  2. 引入命名空间using System.ComponentModel.DataAnnotations;

  3. 在属性上,使用特性编写验证规则

    常用特性有:

    ​ Required:必填验证。[Required(ErrorMessage = “请输入用户”)]

    ​ Compare:比较验证,与其他的属性进行比较。[Compare(“PassWord2”)]

    ​ StringLength:字符串的长度验证。[StringLength(5)]

    ​ Range:数字(整数和浮点数)、时间等类型的数据范围验证。[Range(10,20)]

    ​ RegularExpression:正则表达式验证。[RegularExpression(@”d{2}”]

    ​ EmailAddress:Email格式验证。

  4. 在UI上使用验证规则

    使用强类型视图模型 Inherits=”System.Web.Mvc.ViewPage<Model类>”

    引用Content/Site.css样式文件,才能使提示信息有样式效果

    在要验证的控件后面添加<%=Html.ValidationMessage(“属性名称”) %>显示指定属性的错误信息

  5. 控制器对Model的处理

    Action方法上参数传入Model数据:public ActionResult Register(Student stu)

    业务操作前判断Model数据是否有效:if (ModelState.IsValid)

    ​ ModelState是模型的状态信息

    ​ 可以是使用ModelState添加业务逻辑错误信息:ModelState.AddModelError(“errPwd”, “密码错误”);

    ​ 在客户端上使用<%=Html.ValidationMessage(“errPwd”)%>显示错误信息

    返回Model:return View(“~/Views/Home/Index.aspx”,stu);

7.3、客户端验证

8、HtmlHelper工具类

HTML.

8.1、为什么使用HtmlHelper生成HTML?

  • HtmlHelper是MVC自带的类,用于生成标准的HTML标签
  • HtmlHelper生成的元素能更好的使用MVC的功能,例如:验证框架样式的呈现及数据的保存
  • 具有OOP编程的特点,代码可读性更强

8.2、如何使用HtmlHelper生成表单?

  • ActionLink和RouteLink :生成超链接

    1
    2
    3
    @Html.ActionLink("linkName","action","controller",new {id="id",attribute="list"});

    @Html.RouteLink("linkName","routerName",new {controller="controller",action="action" },new {id="id",attribute="list"});
  • BeginForm :生成表单,有两种写法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //方法一:
    @using (Html.BeginForm("actionName", "controllerName", FormMethod.Post))
    {

    }
    //方法二(推荐)
    @{Html.BeginForm("actionName", "controllerName", FormMethod.Post);}
    //form主体
    @{Html.EndForm();}
  • TextBox:文本框

    1
    2
    3
    4
    5
    6
    //TextBox
    @Html.TextBox("idAndNameValue","defaultValue",new {diyAttribute="value"});

    //TextBoxFor
    @model MVC_Models.Models.Movie
    @Html.TextBoxFor(m =>m.Title, new { @style = "height:50px;" });
  • Password:密码框

  • TextArea :文本域

  • CheckBox :复选框

  • RadioButton :单选按钮

  • ListBox :列表框

  • DropDownList :下拉框

  • RenderPartial: 生成部分视图(用户控件)

9、Razor视图

转义 @@

注释 @**@

9.1、母版页

1
2
3
4
@{
Layout="link address";
@ViewBag.Title=“”; //设置标题
}

@表达式的结果会HTML编码。如果希望不进行HTML编码,可以使用方法Html.Raw()。1

1
2
3
4
5
6
7
8
9
10
11
12
13
@ViewBag.Title   //输出标题

@Styles.Render("") //读取引入CSS文件

@Script.Render("") //读取引入JavaScript文件

@RenderBody() //输出显示内容页的内容,母版页中必须使用该方法

@ReaderSection(“SectionName”,required:false) //类似mater页面你的占位控件,第一个参数表示要占位的名称,该作为在内容页是否是必须的
//使用方法如下
@section SectionName{
<p style=“color:red;”>这是一个p标签</p>
}

9.2、代码块

1
2
3
4
5
6
7
@{code}    //大括号里可以进行C#和HTML代码混合

//例如
@{
string name="myname";
<p><b>@name</b></p>
}

9.3、语句块

9.3.1、分支
1
2
3
4
5
@if(条件)else{}

@if(条件){}else if(){}

@switch
9.3.2、循环
1
2
3
4
5
6
7
@for(;;){}

@foreach

@while

@do{} while(条件);

9.4、视图类型的声明

@model

例:@model Repository.Student //表示该视图的类型是student类,注意不能以分号

9.5、命名空间的引用

@using namespace //不能以分号结尾

10、分区项目

功能:同一个项目按功能可划分多个区域,典型就是前台和后台之分

添加分区:解决方案右键添加,选择区域选项,输入区域名称,确认。

文章作者: Oxywen
文章链接: https://oxywen.cn/post/asp-net/4/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不闻星河须臾