MVC系列随笔四

-》MVC→请求 处理 相应
原理:客户端请求url→Controller→Model→Data Provider(sql server)
             →View(将数据返回给视图)
1.一种编程模式,分为3部分:模型、视图和控制器
 ->模型:表示程序的数据和状态的代码。包括业务逻辑、数据库和底层之间的相互操作和验证规则
 ->视图:用户界面,模型和视图是一对一或者一对多,模型的操作都应该是通过所关联的视图的变化反映出了的
 ->控制器:模型和视图之间的调节周旋,用户对视图的操作用过控制器响应给模型
2.优点:清晰的区分每个单元,适合许多开发人员开发一个项目
    单元测试变的简单
 缺点:复杂性大,开发效率低,不适合小型、开发周期紧急的应用程序
3.Razor视图引擎?NuGet包管理系统?
4.MVC支持在应用程序中的组件之间实现"更清晰的关注点分离"(这是需要特别小心的)?
5.控制器的定义:MVC中的控制器,主要负责相应用户的输入,通常情况随着输入会修改模型。
       控制器主要关注的是应用程序流,和输入数据的处理,和相关视图输出数据的提供。
6.MVC在web环境中工作的原理:MVC提供的是方法调用的结果,而不是动态生成的页面
7.MVC控制器中的index()方法负责决定当浏览网站首页时触发的事件
 
  ------------------约定---------------------
  Controller放在controllers文件夹中,并且命名方式以XxController名字结尾
  每个Controller都对应View中的一个文件夹,并且跟Controller名相同
  Controller中的方法名都对应一个View(非必须,但建议这么做),而且View的名字和Action的名字相同
 
   -------------------------开发流程-------------------------
   新建Controller
   创建Action
   根据Action创建View
   在Action获取数据并生产ActionResult传递给View
   View是显示数据的模板
   url请求→Controller.Action处理→View响应
  
   --------------------------MVC优点---------------------
   1.很容易将复杂的应用分成M、V、C模型  有效简化了复杂的结构,体现了很好的分离原则
   2.因为没有使用server-based forms。控制起来更加灵活,页面更加干净
   3.可以控制生成自定义的url。seo友好的url
   4.强类型View实现,更安全、更可靠、更高效
   5.让web开发可以专注于某一层。更利于分工配合适合用于大型构架开发
   6.很多企业已经开始使用MVC作为开发框架  MVC+EF+WCF
  
   ------------Global-------------------
   路由集合中已经存在名为“Default”的路由。路由名必须是唯一的。
  
   MapRoute
   对于一个网站,为了SEO友好,一个网址的URL层次不要超过三层
   域名第一层,频道第二层,网页最后一层   使用默认实例中的"{controller}/{action}/{其他参数}"会影响网站的SEO
  
  
   (1)Routing 规则有顺序(按照的是添加的顺序),如果一个url匹配了多个Routing规则,则按照第一个匹配的Routing规则执行
   (2)由于上面的规则,要将具体频道的具体页面放在最上方,将频道首页和网站首页放在最下方
   (3){*values}表示后面可以使任意的格式
  
   测试Routing
   用于测试url写错或顺序不对问题,借助于RouteDebug辅助类(插件dll)
    添加这个RouteDebug.dll到项目中,并且添加引用
 在Application_Start方法中添加一句话:
 RouteDebug.Routebugger.RewritesForTesting(RouteTable.Routes);
 -----------------------Controller/Action--------------------
 1.Controller负责获取Model并将Model数据传递给View对象,通知View对象显示
 2.在ASP.NET MVC中,一个Controller可以包含多个Action,每一个Action都是一个方法,返回一个ActionResult实例
     ActionResult类包括ExecuteResult方法,当ActionResult对象返回后会执行此方法
 ->页面处理流程
 发送请求→UrlRoutingModule捕获请求→MVCRoutingHandler.GetHttpHandler()→MVCHandler.ProcessRequest()
 ->MVCHandler.Processrequest()处理流程
 使用工厂方法获取具体的Controller→Controller.Execute()→释放Controller对象
 ->Controller.Execute()处理流程
 获取Action→调用Action方法获取返回的ActionResult→调用ActionResult.ExecuteResult()方法
 ->ActionResult.ExecuteResult()处理流程
 获取IView对象→根据IView对象中的页面路径获取Page类→调用IView.RenderView()方法(内部调用Page.RenderView方法)
 -----------------------------------View/Model-------------------------------------:
 在MVC中,Model对象是指包含了数据的模型
     Controller将Model传递给View以后,View对象中不应该做任何的业务逻辑处理,仅仅根据Model对象做一些显示逻辑的处理
 传递Model对象时,有两种选择:
 1.传递一个弱类型的集合,即成员为Object类型的集合,在View中需要将每个成员转换为我们需要的类型,比如in,string,自定义类型等等
 2.传递强类型对象,这些类型是我们自定义的。在View中直接使用我们传递的强类型对象,不需要再转换类型
 ->如何传递
  ASP.NET MVC 框架定义了ViewContext类,直译后是"View上下文",其中保存和View有关的所有数据,其中Model对象也封装在了此类型中
  ViewContext对象包含三个属性:
  ·IView View
  ·ViewDataDictionary ViewData
  ·TempDataDictionary TempData
 
  ViewData和TempData是用来存储Model对象的。
  Controller的View方法会将Controller类的ViewData和TempData属性值传递给ViewResult
  ViewData和TempData的区别(都可以传递弱类型数据)
  ·ViewData的生命周期和View相同,只对当前View有效
  ·TempData保存在Session中,Controller每次执行请求的时候会从Session中获取TempData并删除Session,获取完TempData数据后虽然保存在内部的字典对象中,但是TempData集合的每个条目访问一次后就从字典表中删除。也就是说TempData的数据至多只能经过一次Controller传递
 
  3.HtmlHelper(内部定义了各种扩展方法)--System.Web.Mvc.Html
  有七个静态类组成:FormExtensions   InputExtensions   LinkExtensions   SelectExtensions   TextAreaExtensions   ValidationExtensions   RenderPartialExtensions
 
  1>FormExtensions
 BeginForm 主要实现表单定义的开始部分
 BeginRouteForm 主要实现表单定义的开始部分,其中以路由的方式设置Action的值
 EndForm  主要实现表单定义的结束部分  Html.EndForm()=</form>  也可以用using语句,替代Html.EndForm()
 2>InputExtensions
 CheckBox主要实现复选框控件
 Hidden 定义表单中有关变量的隐藏数值
 Password主要实现输入密码的文本框
 RadioButton主要实现单选按钮控件
 TextBox主要实现输入的单行文本框
 3>LinkExtensions
 ActionLink主要实现一个连接
 RouteLink主要实现一个连接
 4>RenderPartialExtensions
 RenderPartial用于显示用户控件
 5>SelectExtensions
 DropDownList实现下拉列表框
 ListBox实现一个列表框
 6>TextAreaExtensions
 TextArea实现多行文本框
 7>ValidationExtensions
 ValidationMessage设置验证框,不正确会变成红色,右边会出现一个*
 ValidationSummary显示验证摘要
--------------------------------------------------------------------ViewEngine解析------------------------------------------------------------------
  为什么使用ViewEngine,ViewEngine的作用?
  答:asp.net webform页面自带语法和功能,编译页面,输入HTML,为了继续使用ASP.NET WebForm的页面引擎,asp.net         mvc抽象出来了viewengine
  作用就是为了找到view对象,编译view对象中的语言代码实行语言逻辑,并输入HTML
 1.IView接口
 IView接口是MVC结构中对View对象的抽象,此接口只有一个方法:
 void Render(ViewContext viewcontext,TextWriter textwriter);
 render 方法是对View对象的展示,通常是将HTML写入到Writer中供浏览器展示
 
 --------------------------------------Razor语法(最新标准)--------------------------------------------
  ·输出@符号:@@
  ·输出Email地址:Razor模板会自动识别出Email地址,所以不需要我们进行任何的转换。而在代码块中,只需要使用@:[email protected]即可。@: 表示后面的内容为文本
  ·输出HTML代码(包含标签):直接输出,string html="<font color=\"red\">文本</font>";@html
  ·输出HTML内容(不包含标签):
    有两种方法,第一种:IHtmlString html=new HtmlString("<font                   color=\"red\">文本</font>");@html;第二种:string html="<font color=\"red\">文本</font>";@Html.Raw(html);

--------------------------------------------Filter (AOP-aspect oriented programming 切面编程)------------------------------
1.Filter即为过滤器
2.asp.net mvc中,有三种拦截器,Action拦截器,Result拦截器和Exception拦截器
3.拦截器要继承FilterAttribute基类,Action拦截器还要实现IActionFilter接口,而Exception拦截器需要实现IExceptionFilter接口
Exception拦截器最后一行filterContext.ExceptionHandled=true;(很重要),告诉系统,异常已经处理,不要再次处理了
4.Filter的适用情景:
 ->判断登录与否或用户权限
 ->决策输出缓存
 ->防盗链
 ->防蜘蛛
 ->本地化与国际化设置
 ->实现动态Action
5.asp.net MVC提供了以下几种默认的Filter:
    Filter Type   实现接口      执行时间              Default Implementation
 Authorization  IAuthorizationFilter  在所有Filter和Action执行之前执行     AuthorizeAttribute
 Action filter   IActionFilter     分别在Action执行之前和之后执行     ActionFilterAttribute
 Result filter   IResultFilter     分别在Action Result执行之前和之前    ResultFilterAttribute
 Exception filter IExceptionFilter   只有在filter,或者action metod,或者    HandleErrorAttribute
                 action result抛出一个异常时候执行
6.Action执行前:OnActionExecting方法先执行→Action执行→OnActionExecuted方法执行→OnResultExecuting方法执行→返回的ActionResult中的executeResult方法执行→OnResultExecuted执行
7.全局Filter
 在Global.asax中:
 public static void  RegisterGlobalFilters(GlobalFilterCollection filters)
 {
  filters.Add(new HandleErrorAttribute());
  //注册全局过滤器
  filters.Add(new TestFilterAttribute(){Message="全局"});
 }
8.默认情况下Action上TestFilterAttribute标签后,虽然在Controller上也打上了此标签,单它只有Action上的标签作用了。
 补充:如果Action没有打上TestFilterAttribute标签,那么Controller上的标签便会被执行
 要想Controller和Action上的Filter都执行,需要加上这一句话:
 [AttributeUsage(AttributeTargets.All,AllowMulitiple=true)]即可
9.AcceptVerbs规定页面的访问形式,如:
 [AcceptVerbs(HttpVerbs,Post)]
 public ActionResult Example(){
  return View();
 }
 页面只能以Post形式访问,即表单提交。
10.ActionName
 规定Action的名称
 应用场景:如果不想用方法名作为Action名,或Action名为关键字的话,如:
 [AcitonName("class")]
 public AcitonResult Example(){
  return View();
 }
11.NonAction
 当前方法仅是普通方法不解析为Aciton
12.OutputCache
 为Action添加缓存
  [OutputCache(Duration=60,VaryByParam="*")]
  public ActionResult Example()
  {
   return View();
  }
13.ValidateInput
 该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@Page的属性无法完成等同任务)
 [ValidateInput(false)]
 public ActionResult Example()
 {
  return View();
 }
14.ValidateAntiForgeryTokenAttribute
  用于验证服务器篡改
  [ValidateAntiForgeryToken]
  public ActionResult Example()
  {
  return View();
  }
-------------------------------------------MVC+EF-----------------------------------
1.注意点:修改,以往做法是先把数据查出来,然后在修改,然后再放回数据库
    小技巧 
    EF上下文.实例名.Attach(页面传过来的实例);
    EF上下文.ObjectStateManager.ChangeObjectState(实例,System.Data.EntityState.Modified);
    EF上下文.SaveChanges();

时间: 2024-11-01 16:55:22

MVC系列随笔四的相关文章

MVC系列随笔一

学习MVC我做了一些笔记,在学习MVC之前呢,我们需要先了解和MVC一起使用的小伙伴们 做事情要抓重点:    为什么要学MVC        MVC的好处        MVC如何使用,MVC的特点        MVC的原理        这种MVC模式能否扩展 ->ORM 框架 1.从广义上理解:ORM框架 面向对象的对象模型和关系型数据库的数据结构之间的转换   从狭义上理解:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口. ->EF框架(Enti

MVC系列随笔三

->Lambda表达式   List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };            arr.ForEach(new Action<int>(delegate(int a) { Console.WriteLine(a); }));            arr.ForEach(new Action<int>(a => Console.WriteLine(a))); 匿名

MVC系列随笔二

->Linq 1.隐式类型 var a=1;var b="哈哈";在不知道类型的情况下使用,IL会根据赋值类判断类型,不会影响效率.因为IL产生的中间一样.var 必须赋值.2.匿名类型 var entity= new {title="我是匿名类型",fun="我很有用"}; 把一个对象的属性copy到匿名对象中,不用显示指定属性的名字,原始的属性名字会被copy到匿名对象中. 监视entity会发现它的类型就是Anonymous Type

MVC系列——MVC源码学习:打造自己的MVC框架(四:自定义视图)

前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾.对于这个系列,通过学习源码,博主也学到了很多东西,在此还是把博主知道的先发出来,供大家参考. 本文原创地址:http://www.cnblogs.com/landeanfen/p/6019719.html MVC源码学习系列文章目录: MVC系列——MVC源码学习:打造自己的MVC框架(一) MVC

ASP.NET MVC Model元数据(四)

ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数据有更清楚的了解,当然了也不会是特别全面的,因为后面还有篇幅.希望能给大家带来好的效果. Model元数据 什么是Model元数据? 生成Model元数据的过程[一] 生成Model元数据的过程[二] ModelMetaData的定义.详解 Model元数据应用(常用特性应用)-1 Model元数据

ASP.NET MVC Model验证(四)

ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型

学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!

转自 学习ASP.NET MVC系列: 学习ASP.NET MVC(一)--我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)--我的第一个ASP.NET MVC 控制器 学习ASP.NET MVC(三)--我的第一个ASP.NET MVC 视图 学习ASP.NET MVC(四)--我的第一个ASP.NET MVC 实体对象 学习ASP.NET MVC(五)--我的第一个ASP.NET MVC CURD页面 学习ASP.NET MVC(六)--我的第一个ASP.NET M

MVC ListView 随笔

1.什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑----摘自百度百科. M:model:指的是用来封装信息的对象. V:view:用来显示model中封装的信息的组件. C:controller:用来控制model中的信息怎么输出到vi

【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权

最近比较忙,博客很久没更新了,很多博友问何时更新博文,因此,今天就花了点时间,写了本篇文章,但愿大家喜欢. 本篇文章不适合初学者,需要对ASP.NET MVC具有一定基础. 本篇文章主要从ASP.NET MVC 基架角度去分析MVC框架是如何实现资源过滤,资源授权,感兴趣的,欢迎阅读. 相关文章,请参与ASP.NET MVC系列 一 ASP.NET MVC框架验证机制 为了更加透彻地了解MVC的过滤机制,我简要地画了如下UML图. 下面,我们根据如上的UML图来简要分析一下. (一)MVC基架过