第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接口

image

Execute方法只有一个RequestContext参数,请求上下文,然后再请求上下文里获取请求、执行。

image

HttpContext上下文里还有各种各样的参数可以获取。

 

Controller的基础类实现

可以不继承IController接口,而继承自ControllerBase抽象类,抽象类里有很多API接口。

 

Controller类和Action类

-System.Web.Mvc.Controller类

-Action方法

 

Action方法

image

所有Action方法必须是public,不然Routing没法调用它。

如果启动了一个Controller,默认情况下只有本域名下的请求可以调用Action。

永远不要相信用户的输入,出于安全性考虑,一定要用HtmlEncode把脚本变成纯文本。

第二种url的world自动匹配到name参数。

 

使用多个参数

image

 

默认Url

image

这是在Action设置参数默认值,而不是在路由,这是C# 4.0的特性。

 

ActionResult

image

在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

image

 

JavaScriptResult

image

用于服务端生成脚本,客户端马上执行。ContentResult做不了这事,因为ContentResult输出的文本都是Encode之后的,它把JavaScript代码都全部变为纯文本了,到了客户端也无法执行。

 

RedirectResult

自动跳转

等同于使用HttpResponse.Redirect方式。

但多数情况我们使用下面的方式。

 

RedirectToRouteResult

-RedirectToRoute

-RedirectToAction

 

它和RedirectResult不一样,RedirectResult实现的是Url的跳转,但实际情况中,尤其是MVC架构,Url都被拆成了Controller和Action,我们更应该直接Redirect到Action和Route中。

 

ViewResult和PartialViewResult

使用字典类返回结果

 

ActionResultHelper函数

输出结果帮助函数

image

 

隐式调用ActionResults

image

 

按第一种方式写Action也可以,这个函数一样可以被调用,因为它会被自动封装为第二个函数,用Content纯文本输出。

 

总结

-Controller类的基本构成

-ActionResult的使用

2010.9.29

posted @ 2010-09-29 22:26  山天大畜  阅读(1422)  评论(0编辑  收藏  举报