MVC技术点
Controller父类里边含有的:
IActionInvoker _actionInvoker; 调用action方法
ModelBinderDictionary _binders; 模型绑定
RouteCollection _routeCollection; 路由集合
ITempDataProvider _tempDataProvider
controller传递数据的方法。这些方法都是在abstract class ControllerBase :IController中,父类Controller的父类ControllerBase中
viewbag
viewdata
tempdata
.cshtml代码会被编译成前台页面类,继承自父类
.NET MVC框架在找 控制器类的时候只会找后缀名为Controller的类并继承于Controller类的类名
mvc框架创建Controller class对象,通过Controller对象调用Action方法,在Action方法里为这些属性赋值,方法返回一个ActionResult,ActionResult有一个重要方法是ExcuteResult方法,这个方法需要把这些属性传给视图类中相同的属性里。这些属性通过viewContext传过去
public class RouteConfig{
public static void RegisterRoutes(RouteCollection routes){
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
name: “Default”,
url: “{controller}/{action}/{id}”,
defaults: new { controller =”stu”,action=”Index”, id==UrlParameter.Optional}
)
}
}
前台页面类继承自 WebViewPage<T>泛型类
Action方法接收浏览器参数方式:
1、接收 url路由中配置的同名参数,也可以说是根据配置文件,就是在routeConfig中根据{controller}{action}{id}这种规则配置
2、Model 模型实体绑定的方式,post的请求方式才能接收
3、通过Request.Form["Name"]/ Request.QueryString接收
4、通过 FromCollection
Action方法输出返回值
1、string:直接返回 响应报文字符串
2、ViewResult:返回控制器结果对象 调用父类ViewResultBase的ExecuteResult方法,重写了父类的FindView方法
3、ActionResult也可以说是ViewResult的子类,这些类的返回结果
4、ContentResult,返回文本,或者说是字符串
5、EmptyResult 返回空
6、FileResult 它是abstract class 返回二进制 适用于返回二进制验证码图片。写入文件内容,具体写入方式在派生类中
7、FileContentResult 父类FileResult 通过 文件byte[] 写入文件
FilePathResult 父类FileResult 通过 文件路径 写入文件
FileStreamResult 父类FileResult 通过 文件Stream写入文件
8、HttpStatusCodeResult 返回状态码
9、JavaScriptResult 返回js代码
10、JsonResult:返回Json字符串
10、RedirectResult 返回302状态码(重定向状态码) 使用Response.Redirect重定向页面
11、RedirectToRouteResult 返回302状态码(重定向到路由) 根据Route规则重定向页面
12、ViewResultBase abstract(抽象类) 加载视图 调用IView.Render()
PartialViewResult 调用父类ViewResultBase的ExecuteResult方法,重写了父类的FindView方法
Action方法向View传递数据方式:
ViewBag和ViewData共享数据
TempData[""]有特殊的用处
Model本质是ViewData的属性ViewData.Model Model传值
ViewBag是操作ViewData的另一种方式
Controller中和View上都有一个ViewBag,Controller中的ViewBag可以向View上的ViewBag传值
在RouteConfig里注册路由。查看、修改视图引擎,让视图引擎在指定的地方加载
由源码到编译后的视图类是由 Razor视图引擎编译的
在网站第一次被访问的时候,对应的视图引擎会将前台页面编译成 前台页面类
与WebForm的aspx页面比较特点是 页面简洁,没有页面生命周期
视图引擎的语法分 C#代码,普通HTML字符串,Razor C#语句块
注意:一般不在视图上定义方法,因为方法就是业务,而mvc本身就是为了把业务和视图分开。Razor之所以支持在视图上定义方法,就是为了解决视图上要重复 输出HTML代码块 的情况
C#代码块输出文本两种方式:
1、使用Razor内置标签 <text> </text>
2、@:文字
Razor语法中的web内置对象@Request.RawUrl @Response.Write 等等
@strHTML 这样输出的缺点:此处会转义HTML
OutputCache缓存 [OutputCache(Duration=20)] 相当于aspx的整页缓存, 默认为绝对过期时间
.net MVC前端和后端数据校验
一、客户端校验
客户端的校验有两种方式:jQuery、MVC方式
对象校验之前需要特别注意:View视图的创建必须是强类型的。
在Models文件夹里添加一个类Teacher,添加一个Teacher Controller,为改Controller添加一个Create的Action,添加对应于该Action的视图(选择Teacher强类型视图)
<% Html.ValidationSummary(true) %>
在定义Teacher类时定义了Tphone属性为字符串类型,这样在我们输入时就通过class="field-validation-valid"限定了我们只能输入字符串。这种验证简单但是有一定局限性。下面就讲解我们自定义的两种验证方式
- jQuery验证方式:
添加script脚本引用:
<script type="text/javascript" src="../../Scripts/jquery-1.4.4.js"></script>
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<scriptsrc="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> jquery校验隐式请求包
页面中设置 <% Html.EnableClientValidation(true); %> MVC3,MVC4中默认开启
添加JQuery进行数据验证
- <script type="text/javascript">
- $(function () {
- $("#frmAdd").validate({
- rules: {
- Tsex: {
- required:true,
- digits: true
- }
- },
- messages: {
- Tsex:"*必须输入0或者1"
- }
- });
- });
- </script>
前端 Validate 校验
- @using (Html.BeginForm("Create", "Bc_Brand_Series", FormMethod.Post, new {@id="form1",@name="form1"}))
- {
- @Html.AntiForgeryToken()
- }
- MVC验证方式
方式一:Model层校验
.NET 框架中的System.ComponentModel.DataAnnotations命名空间包括了众多可为你所用的内置验证特性,常用的四个
注解验证-Required(必填项)-StringLength-Range(某个范围)-RegularExpression,Compare比较验证,
Remote远程校验 例如远程ajax请求 这些属性的命名空间在System.Web.Mvc下
用法[Remote("方法名(ActionResult)","控制器名")]
通过继承自System.ComponentModel.DataAnnotations命名空间中的 ValidationAttribute基类,自定义定制的验证特性
这里的自定义验证特性要和Jquery校验插件脚本配合使用才能实现客户端校验的效果
方式2、EF框架实体类校验
ValidateInput[(false)] 关闭请求报文中危险标签字符验证 XSS脚本攻击会利用字符串中嵌入js脚本攻击服务器
二、服务器端校验
MVC设计模式提供的后台校验数据方法
服务器端校验需要在Action中校验:ModelState.IsValid。True是验证通过,false验证不通过
需要先在Teacher类添加一些验证,代码
- [StringLength(10, MinimumLength = 6)]
- [Required(ErrorMessage = "工号为必填项")]
- public string Tno { set; get; }
- [StringLength(10, MinimumLength = 2)]
- [Required(ErrorMessage = "姓名为必填项")]
- public string Tname { set; get; }
- [Range(0, 1)]
- [Required(ErrorMessage = "性别为必填项")]
- public int Tsex { set; get; }
- [StringLength(30, MinimumLength = 6)]
- public string Taddress { set; get; }
- [RegularExpression(@"^\d+$", ErrorMessage = "*电话必须是数字")]
- public string Tphone { set; get; }
相应的修改Action方法的代码
- public ActionResult Create(MvcLogin.Models.Teacher teacher)
- {
- if (ModelState.IsValid) //校验成功
- {
- //执行数据的入库、更新等操作
- }
- else
- {
- //给出提示信息
- }
- return View(teacher);
- }
WebConfig中可以设置全局客户端校验是否开启或关闭
appSettings节点中 <add key=”ClientValidationEnabled” value=”true”>
对于任何BS程序来说,安全始终是最为重要的一个话题,而跨站点请求伪造是最容易发起的,只需要下个工具(如fiddler)即可轻易实现。我们可以通过对Controller类采取下列措施防止该类黑客行为的发生:
1、在提交数据处理的页面上,加上@Html.AntiForgeryToken()语句。
2、在接收并处理提交的数据的方法上加上[ValidateAntiForgeryToken]属性。
3、对于所有对数据库等信息进行操作的方法,全部加上[HttpPost]属性,即使用POST提交数据。
后台接收参数 不确定用Form还是QueryString时 用Request.Params[""]
_Layout文件引用js文件
Mvc,App_Start文件夹中的BundleConfig.cs文件是用于合并js或css文件,接收这些文件请求的
BundleTable.EnableOptimizations=true;开启js/css 合并压缩功能
mvc的异步请求方式
异步表单 见part5_MVC_Ajax ppt7
MVC路由映射
创建哪个控制器,调用控制器里的哪个方法都是根据URL决定
URL地址通过请求报文发到服务器软件,IIS Express到路由(RouteConfig.cs)里去 从前到后查找匹配
静态路由表(RouteTable)里可以配置多个路由规则。细节:如果要定义多个URL规则,就是把描述的详细的路由规则放在最上边
RoutDebugger 检测路由插件
路由约束-正则表达式
命名路由:生成指定路由名的url超链接
@Html.RouteLink("test","Default",new {Controller="home",action="index",id=1});
会按照找到的路由规则生成超链接(没有使用默认值)
Mvc中使用一般处理程序,例如验证码文件是一般处理程序,可以在view上指定这种文件
<img src=”~/ValidateCode.ashx”/>
请求管道中的第八个事件 创建前台页面类对象,调用对象中的Process Request方法,生成代码发送到浏览器
part_6_MVC_路由机制 ppt10 WebForms与MVC
mvc框架是基于mvc模式的,mvc模式特点是把业务代码和视图完全分离开,代码和结构分开
server-based forms
Area 区域使用
当前区域路由方法如何注册区域路由到静态路由表里的
区域注册是在bin目录找所有的程序集,根据程序集中的namespace判断是否和注册区域的namespace一样,找到后查看是否继承了父类AreaRegistration,如果是则是一个区域注册类
区域控制器放到外面程序集
区域注册类里面有两个方法AreaName,RegisterArea
AreaName 查找区域视图,标记区域视图所在的文件夹;RegisterArea作用 注册区域路由
MVC过滤器
过滤器类型 | 接口 | 默认实现 | 描述 |
Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
Result | IResultFilter | ResultFilterAttribute | 在动作结果被执行之前和之后运行 |
AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先运行,在任何其它过滤器或动作方法之前 |
Exception | IExceptionFilter | HandleErrorAttribute | 只在另一个过滤器、动作方法、动作结果弹出异常时运行 |
Action过滤器及三种使用方式
执行Action方法的前面和后面,加载视图的前面和后面可以添加一些方法,就是过滤器。
Action过滤器
ActionFilterAttribute 可以给Action添加类过滤器和方法过滤器
全局过滤器 在 FilterConfig中设置
Result过滤器
可以给Result添加方法过滤器
在过滤器上下文里的RouteData中获取url信息
RouteData中保存了当前请求匹配的路由信息和路由对象。如果本次请求 是请求了某个区域里的控制器方法,还可以通过filterContext.RouteData.DataTokens[“area”] 获取区域名
过滤器上下文(ActionExecutingContext)补充-跳过Action方法
检查被请求方法是否加了 MoneyAttribute特性
If(filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute),false)){
直接为请求设置返回结果,而不执行 对应的Action方法,也不执行OnActionExcuted,但是,会执行 Result过滤器和 生成视图
filterContext.Result=new ContextResult(){ Content=”<br/>直接被跳过了吧!<br/>”};
}
.net mvc中的过滤器实现了AOP面向切面的组件,在Action的执行前或者执行后做一些特殊的操作(比如身份验证,日志,异常,行为截取等),不想让开发人员去关心和写这部分重复的代码,就可以用AOP截取实现。MVC项目中直接使用它提供的Filter的特性来解决,不用实现复杂的AOP
授权过滤器的执行位置和方法
AuthorizeAttribute授权控制类,OnAuthorization(AuthorizationContext filterContext)授权方法和授权上下文对象。放在OnActionExcuting方法前面用
MVC过滤器-全局异常处理类
HandleErrorAttribute 异常类