MVC技术点

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上都有一个ViewBagController中的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"限定了我们只能输入字符串。这种验证简单但是有一定局限性。下面就讲解我们自定义的两种验证方式

  1. 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进行数据验证

  1. <script type="text/javascript">
  2.         $(function () {
  3.             $("#frmAdd").validate({
  4.                 rules: {
  5.                     Tsex: {
  6.                     required:true,
  7.                     digits: true
  8.                     }
  9.                 },
  10.                 messages: {
  11.                     Tsex:"*必须输入0或者1"
  12.                 }
  13.             });
  14.         });
  15.     </script>

 

前端 Validate 校验

  1. @using (Html.BeginForm("Create", "Bc_Brand_Series", FormMethod.Post, new {@id="form1",@name="form1"}))
  2.   {
  3.        @Html.AntiForgeryToken()
  4.    }

 

 

  1. 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类添加一些验证,代码

  1.   [StringLength(10, MinimumLength = 6)]
  2.         [Required(ErrorMessage = "工号为必填项")]
  3.         public string Tno { set; get; }
  4.         [StringLength(10, MinimumLength = 2)]
  5.         [Required(ErrorMessage = "姓名为必填项")]
  6.         public string Tname { set; get; }
  7.         [Range(0, 1)]
  8.         [Required(ErrorMessage = "性别为必填项")]
  9.         public int Tsex { set; get; }
  10.         [StringLength(30, MinimumLength = 6)]
  11.         public string Taddress { set; get; }
  12.         [RegularExpression(@"^\d+$", ErrorMessage = "*电话必须是数字")]
  13.         public string Tphone { set; get; }

相应的修改Action方法的代码

  1.   public ActionResult Create(MvcLogin.Models.Teacher teacher)
  2.         {
  3.             if (ModelState.IsValid)  //校验成功
  4.             {
  5.                 //执行数据的入库、更新等操作
  6.             }
  7.             else
  8.             {
  9.                 //给出提示信息
  10.             }
  11.             return View(teacher);
  12.         }

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 异常类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值