ASP.NET MVC笔记
MVC如何请求服务
View()返回与Action名相同的视图文件,
View(Object)文件查找同上,将Model传递到页面
View(String)呈现指定的视图文件
View(IView)呈现自定义的视图
View(String,Object)在指定的页面传递Model对象
View(String,String)在视图页面使用母版页,第二个参数为母版页的路径
View(IView,Object)在自定义视图中传递Model对象
View(String,String,Object)是在使用母版页的视图中传递Model对象
ActionResult是一个抽象类
ActionResult的子类:
System.Web.Mvc.ContentResult:返回一串字符
示例:return Content("ASP.NET MVC");
System.Web.Mvc.EmptyResult:返回空内容
示例:
System.Web.Mvc.FileResult:返回一个文件
示例:return File();
System.Web.Mvc.HttpUnauthorizedResult:未经授权的请求结果
示例:return new HttpUnauthorizedResult();
System.Web.Mvc.JavaScriptResult:返回js脚本
示例:return JavaScript("");
注意:需要在视图层写$.getScript("/Home/Index");
System.Web.Mvc.JsonResult:返回Json格式,常用于Ajax的应用
示例:return Json(new {Name="qct",Age=22},JsonRequestBehavior.AllowGet);
System.Web.Mvc.RedirectResult:重定向站内或站外
示例:return Redirect("url");
System.Web.Mvc.RedirectToRouteResult:站内请求
示例:return RedirectToAction("Login");//根据控制器和Action
return RedirectToRoute("Login");//根据路由名称
Action方法必须返回ActionResult类型吗?可以返回任何有效的数据类型
URL匹配模式
URL是如何匹配的?根据键入的URL在路由列表搜索,如果没有匹配的项则返回404错误
路由信息在哪里添加?在APP_Start目录下的RouteConfig.cs文件添加
MapRoute(string name,string url,object defaults,object constraints,string[] namespaces)name:路由名称,必须唯一;url:url模式,例如:url:"Admin/{controller}/{action}/{id}";defaults:占位符的默认值;constrains:占位符数据约束;namespaces:命名空间
URL模式的组成元素(例如:url:"Admin/{controller}/{action}/{id}")
字面量:固有的字符串,例如:Admin
占位符:用于获取URL信息的一个标识符,也可称为变量名例如:{}controller}。注意:1.占位符controller和action必须有 ,出现位置不限。是mvc约定的名称controller表示控制器名称,action表示方法。2.URL中要特别注意空格 例如:“Admin/{controller}/{action}/{id}”和“Admin/{controller}/{action}/{id}(此处有空格)”是不一样的
分隔符:/表示路径的分隔符,分割URL不同的信息。
特殊的匹配符::匹配剩余的部分,一般放在最后的参数。例如:url:"{controller}/{action}/{name}" url为: Account/Register/a/b/c 则name=a/b/c。贪婪匹配规则:优先匹配完前面的占位符的所有可能性,在匹配后面的占位符
无效的URL模式:1.不能以“/”或“~”字符开头2.不能包含“?”字符3.占位符不能连续,例如:{controller}-{action}。必须有分隔符来区别
Object defaults:占位符的默认值。表示占位符的默认值,url上如果没有传递时会使用默认值。经验:1.含有默认值的占位符尽量放在URL的参数后面。2.在含有字面量的URL模式中,字面量前面的默认值没有作用
Object constraints:占位符数据约束。1.URL参数的数据有时是有要求的,比如日期、数字、年龄。2.通过constraints编写正则表达式来实现。例如: constraints:new {age=@"\d|\d{2}"
string[] namespaces:命名空间-解决类的冲突
路由从上到下搜索,越放前面,优先级越高。
数据获取
一、如何获取客户端上的数据?
1.表单数据Request.Form["name"]
2.URL上的数据Request.QueryString["name"]
3.路由数据object obj=RouteData.Values["name"]
4.方法上的参数public ActionResult Register(string name),可映射为表
二、控制器数据如何传递到视图?
1.ViewBag和ViewData
a.ViewBag是dynamic类型。例如:ViewBag.data="ASP.NET";
b.VIewData是Object类型。例如ViewData["data"]="ASP.NET";
c.ViewBag和ViewData操作的是同一个数据源,如果添加的Key相同则覆盖,
建议:在同一个项目两者中选一个比较好
生命周期比较短,重定向后数据销毁,作用于ViewResult指向的视图
2.TempData
a.保存的机制是Session,跳转是将数据保存到Session,进入控制器从Session移除
b.重定向后数据不会丢失
3.强类型视图
a.控制器参数为Model类型
b.Return View(Model对象)小技巧:若想预留文本框中的值,可以返回一对象,对文本框的value赋值。例如:
@Model.StudentName
c.定义视图Model的类型
d.页面获取Model数据的方式
--Model为一个对象:1.<%:Model.StudentName%>只用于显示不能给Model赋值,StudentName为属性的名称
2.<%:Html.TextBox("StudentName")%>适用于表单元素,能够赋值给Model,StudentName为属性的名称不区分大小写。
3.<%Html.TextBox("stu.StudentName")%> stu为Action的参数名,StudentName是属性的名称
4.建议:属性前缀要统一,要么统一带前缀要么都不带。
--Model为一个集合:1.通过索引获取对象,以下的案例使用索引0获取集合的第一个对象
2.<%:Model==null?null:Model[0].StudentName%?>以get方式第一次请求时Model为null,所以要非空判断。
3.<%:Html.TextBox("[0].StudentName")%>或<%:Html.TextBox("stu[0].StudentName")%>直接使用索引或通过方法参数名带索引,两种方式建议统一使用一种,因为不能相互访问各自的
4.建议:属性前缀要统一,要么统一带相同的前缀要么都不带。
e.数据绑定
--通过bind特性设置Model绑定的方式
--Bind是BindAttribute别名,需要引用命名空间System.Web.MVC
Exclude:不进行模型映射的操作,这些属性获取不到表单提交的数据,多个属性之间用逗号隔开
Include:进行模型映射的操作,这些属性能得到表单提交的数据,多个属性之间用逗号隔开
Prefix:Model使用前缀
--Bind特性只用于Model类和Action的参数上使用
在Model类上设置,Prefix在这里的设置是无效的
在Action的参数上,视图上必须使用Prefix指定的前缀
建议:不建议在Model类上做绑定,而在Action的参数上使用
--自定义绑定器(使用概率比较少)
自定义类实现接口IModelBinder
ModelBinder使用自定义绑定器
注意:在表单上不要使用前缀绑定模型,
表单数据验证
一、验证规则写在哪里?
1.在Model类的属性上编写
2.应用于模型视图,Inherits="System.Web.Mvc.ViewPage"
二、如何编写并使用验证规则?
1.引用组件System.ComponentModel.DataAnnotations
2.引用命名空间using System.ComponentModel.DataAnnotations
3.在属性上,使用特性编写验证规则
a.Required:必填验证[Required(ErrorMessage="请输入用户")]
b.Compare:比较验证,与其他的属性进行比较[Compare("pwd2")]
c.StringLength:字符串的长度验证[StringLength(5)]
d.Range:数字(整数和浮点数)、时间等类型的数据范围验证[Range(10,20)]
e.RegularExpression:正则表达式验证[RegularExpression(@"\d{2}")]
f.EmailAddress:Email格式
4.在UI上使用验证规则
a.使用强类型视图模型Inherits="System.Web.Mvc.ViewPage"
b.引入样式content/Site.css
c.在要验证的控件后面添加<%=Html.ValidationMessage("属性名称")%>显示指定属性的错误信息
d.提示:为了更好的显示错误信息,建议使用<%:Html.TextBox("StudentName")%>
好处1:样式更丰富 好处2:表单数据不会丢失
5.控制器对Model的处理
a.Action方法上参数传入Model数据public Actionresult Register(Student stu)
b.业务操作前判断Model数据是否有效if(ModelState.IsValid)
--ModelState是模型的状态信息
--可以是使用ModelState添加业务逻辑错误信息ModelState.AddModelError("errPwd","密码错误")
--在客户端上使用<%=Html.ValidationMessage("errPwd")%>
c.返回Model return View("~/Views/Home/Index.aspx",stu);
三、客户端验证
1.启动客户端验证,框架默认启动,若没有启动可在配置文件中配置
里面
2.引用脚本JQuery相应的文件
a.jquery.min.js核心文件
b.validate.min.js验证文件
c.validate.unobtrusive.min.js隐藏验证
d.引用样式文件Content/Site.css
HtmlHelper工具类
一、为什么使用HtmlHelper生成Html?
1.HtmlHelper是MVC自带的类,用于生成标准的Html标签
2.HtmlHelper生成的元素能更好的使用MVC的功能,例如:验证框架样式的呈现及数据的保存
3.具有OOP编程的特点,代码可读性更强
二、如何使用HtmlHelper生成表单?
1.ActionLink和RouteLink:生成超链接
2.BeginForm:生成表单,有两种写法
3.TextBox:文本框
4.PassWord:密码框
5.TextArea:文本域
6.CheckBox:复选框
7.RadioButton:单选按钮
8.ListBox:列表框
9.DropDownList:下拉框
10.RenderPartial:生成部分视图(用户控件)
项目中常用技术
一、Razor视图
1.母版页
a.标题定义:1.2.@:类似视图aspx<%:%>,@表达式或者是@(表达式);@表达式的结果会HTML编码,如果不想HTML编码,使用Html.Raw();
b.@RenderBody():
c.占位控件:@RenderSection("script",required:false);
类似master页面的占位控件,第一个参数表示控件名称,第二个参数表示是否必须
示例:@section scripts{}
d.内容页引入母版页
2.代码块 @{code},大括号里
例如:@{string name="jack";
@name
}
3.语句块
a.分支结构
@if ; @if(条件){} else if(条件) {};@switch;
b.循环结构
@for; @foreach;@while;@do{} while(条件表达式)
4.视图类型的声明
@model 示例:@model Student 该视图的类型是Student类
注意:不能使用分号(;)结束
5.命名空间的应用 @using Mvc.Models
6.@@对@的转义,输出普通符号@,这点类似aspx视图中关键字@class表示类样式
7.@注释的内容@
二、模板视图
注意:分部页、布局页和视图页的区别
分部页内不必用@section scripts,因为@RenderSection("scripts", required: false)在布局页中声明,在视图页中定义使用,那么视图页嵌套分部页,分部页定义@section scripts就无效了。也可以这么理解,@section scripts就是一个占位符,视图页中不写,则script代码体现在@RendBoy中
总结:分部页无法使用@section scripts,直接即可
三、分页
四、验证码制作
分区项目
1.同一个项目可以划分成多个区域(areas),典型的就是前台和后台之分
2.添加分区项目:右击项目,添加“区域”,输入区域名称,例如:admin
3.分区项目路由配置文件
4.路由与控制器的密码
5.视图搜索顺序:
a.区外项目的搜索,b.分区项目的搜索:默认搜索规则:先aspx、ascx、再cshtml、vbhtml;先在分区搜索(views下的控制器文件夹--》shared)
6.分区项目的最佳实践
MVC下Ajax的使用
一、引用重要的脚本:jquery-min.js、juqery.unobtruasive-ajax.min.js
二、Ajax表单-使用AjaxHelper(Ajax工具类)对象的BeginForm()方法构建AjaxForm表单
1.BeginForm()方法
a.是AjaxHelper的扩展方法
b.有10个重载:BenginForm(this AjaxHelper ajaxHelper,string actionName,AjaxOptins ajaxOptions);
c.actionName:Action的方法名称
三、Ajax超链接
1.@Ajax.ActionLink("调用","Ajax",option);
2.分析生成的HTML
3.ActionLink方法的参数信息
四、@Ajax.ViewBag:
五、清空客户端缓存:
六、判断是否Ajax请求的方法
总结:MVC下的Ajax局部刷新通常和分布视图结合使用
MVC下分页
1.Skip()跳过多少条
2.Take()拿多少条
3.Math.ceiling()天花板
当前页码1 每页大小10 总条数86
Math.ceiling(总条数/每页大小)=总页数
86*1.0/10 = 9页
123456789
4.滚动分页原理-滚动事件