第7讲:Controller入门
2010.9.7 苏鹏
内容介绍
-Controller类的基本构成
-ActionResult的使用
预备知识
-安装Visual Studio 2010 Express
-了解ASP.Net
-了解设计模式基本概念
关于Controller
Controller是响应用户输入的部分,然后从Model层拿到数据,最后把数据结果返回给用户。
-Controller是什么?
在MVC架构Controller就是处理所有的用户逻辑,而不是商务逻辑(即数据的增删改,商务逻辑在Model层里做)。
-Controller的变迁
在最开始的时候,用户界面应用程序还没有开发出来,那时的应用程序就是一个命令行,输入一个数,用户输出,计算机计算,然后输出一个数。所以当时的图形界面只是一种想象,连按钮和文本框和事件驱动都没有。开发者就意识到需要有一种途径去监听用户输入,并且根据这些操作实现一些交互性的动作,这应该是MVC架构的设计理念,应该说是基于人性化的第一步。当用户用鼠标点击一个按钮,就会有一个进程瞧一瞧,听一下这个操作,这就是Controller的雏形。
后来,人们认为全局监听比较多余,针对每个控件写一个后置代码来监听这个控件的操作似乎更合理,于是当时,Model层和View以及Presenter层组成的所谓的MVP模型就成为固定的应用程序系统架构。
Windows是有全局的Controller的,但这个Controller不是给你应用程序用的,而是给操作系统用的。你在Windows下面点鼠标、摁键盘,所有的操作,Windows操作系统都会听到,听到之后首先系统会判断它是哪个应用程序发送的,然后,找到具体的应用程序,把消息发给它,说:你看,你的应用程序界面被点了,你要处理一下吧!应用程序再经过操作系统转发的这条消息再进行处理。这一流程叫做消息驱动应用程序开发模式,是Windows应用程序架构基础。比如现在有些应用程序用Hook,Hook就是钩子,是一种应用程序模型,它能监听到其他用户程序的消息,并且把本应发给其它应用程序的消息处理,提前自己拿到一份,杀毒软件、木马都是用这样的技术。
Windows到每个应用程序里面,由于有人替你做Controller和Routing的工作了,所以应用程序自己里面就不做全局监控,点鼠标、点按钮的时候按钮后驱的事件会进行处理。所以这种只使用一个控件作为后置代码注册的方式,我们称为MVP模式。由于这种模式使用越来越多,MVC模式就渐渐淡出大家的视线了。
直到后来ASP.Net WebForm出来了,实际上WebForm本身提供了一种ASP.Net架构下的开发模式,但这种模式不是MVC,实际上还是MVP。它是把Windows下的事件驱动模式照搬到了Web应用程序下面。当时这种模式出来也有好处,用户不用关心所有的通信和所有的事件驱动、事件注册。WebForm事件驱动架构实际上是点击了一个控件之后,服务器就获得了用户提交控件内在的数据,并且使用ViewState来保持用户控件的状态。服务器端为了响应这个请求,需要主动生成相应的一些操作,然后响应事件并执行。所以对于Windows应用程序架构来说,控件状态不重要,因为它在本地。而对Web应用程序架构它的状态是无持续的,所以服务器 端需要回回都记得这个架构的状态并返回。这导致WebForm的应用通信数据量很大,因为它要保存页面上所有控件以及当前运行状态。
MVC架构因此孕育而生。它在Web复活的原因可能是WebForm的重量级对于用户来说有些不适。
MVC架构中另外一个重要的内容是ASP.Net MVC和传统的MVC不一样。在传统MVC架构中,Model层是可以看见View层的信息的,Model层可以接触到View层的事件。在新版本的MVC架构中Model层甚至不知道View层的状态,因为Model层不存在于客户端的内存当中,客户端在Model层中没有任何示例,只有Model层的数据,数据是拿ViewDictionary类装回来的。所以在这种情况下,Controller是MVC架构中的关键,它是衔接两边的桥梁。它需要从Form中拿到用户提交的数据,构造一个ActionResult,然后返回给View。
定义一个Controller
-使用IController接口
Execute方法只有一个RequestContext参数,请求上下文,然后再请求上下文里获取请求、执行。
HttpContext上下文里还有各种各样的参数可以获取。
Controller的基础类实现
可以不继承IController接口,而继承自ControllerBase抽象类,抽象类里有很多API接口。
Controller类和Action类
-System.Web.Mvc.Controller类
-Action方法
Action方法
所有Action方法必须是public,不然Routing没法调用它。
如果启动了一个Controller,默认情况下只有本域名下的请求可以调用Action。
永远不要相信用户的输入,出于安全性考虑,一定要用HtmlEncode把脚本变成纯文本。
第二种url的world自动匹配到name参数。
使用多个参数
默认Url
这是在Action设置参数默认值,而不是在路由,这是C# 4.0的特性。
ActionResult
在MVC中Action是响应用户请求的最小单元。它能使用ActionResult的载体输出丰富的Html。这个其实是返回了一个设计模式中命令模式的对象,这个对象用于在客户端渲染内容。实际上渲染任何内容都需要容器,所以每个ActionResult就成为了ViewResult的容器对象。
ActionResult的重载
-EmptyResult
-ContentResult
-JsonResult
-RedirectResult
-RedirectToRouteResult
-ViewResult
-PartialViewResult
-FileResult
-FilePathResult
-FileContentResult
-FileStreamResult
-JavaScriptResult
EmptyResult
没有任何匹配和执行
表示Action不返回任何东西,类似于函数中返回null
ContentResult
-输出纯文本
它实际上是使用HttpResponse直接输出标记为TextHtml标记的内容,我们一般用它作纯文本的轻量级输出。
ASP.Net Ajax调用的时候比较适用这种纯文本输出。
FileResult
-FilePathResult
-FileContentResult
-FileStreamResult
用于输出二进制文件,这说明Action不但可以返回内容,同样可以返回文件。
JsonResult
JavaScriptResult
用于服务端生成脚本,客户端马上执行。ContentResult做不了这事,因为ContentResult输出的文本都是Encode之后的,它把JavaScript代码都全部变为纯文本了,到了客户端也无法执行。
RedirectResult
自动跳转
等同于使用HttpResponse.Redirect方式。
但多数情况我们使用下面的方式。
RedirectToRouteResult
-RedirectToRoute
-RedirectToAction
它和RedirectResult不一样,RedirectResult实现的是Url的跳转,但实际情况中,尤其是MVC架构,Url都被拆成了Controller和Action,我们更应该直接Redirect到Action和Route中。
ViewResult和PartialViewResult
使用字典类返回结果
ActionResultHelper函数
输出结果帮助函数
隐式调用ActionResults
按第一种方式写Action也可以,这个函数一样可以被调用,因为它会被自动封装为第二个函数,用Content纯文本输出。
总结
-Controller类的基本构成
-ActionResult的使用
2010.9.29