在MVC框架中,控制器必须实现System.Web.Mvc命名空间的IController接口,如下图所示:
//// 摘要:// 定义控制器所需的方法。public interface IController{//// 摘要:// 执行指定的请求上下文。//// 参数:// requestContext:// 请求上下文。void Execute(RequestContext requestContext);}
这是一个很简单的接口。唯一的方法Excute,在请求以控制器为目标时被调用。但是发挥着重要的作用。 在Controller文件夹中创建一个新的名为“BasicController”的类文件,如下图所示:
public class BasicController : IController{public void Execute(RequestContext requestContext){string controller = requestContext.RouteData.Values["controller"].ToString();string action = requestContext.RouteData.Values["action"].ToString();requestContext.HttpContext.Response.Write(string.Format("Controller:{0},Action:{1}", controller, action));}}
IController接口的Execute方法被传递给System.Web.Routing.RequestContext对象,它提供关于请求和匹配路由的信息,如下图所示:
名称 | 描述 |
HttpContext | 返回一个描述当前请求的 HttpContextBase 对象 |
RouteData | 返回一个描述匹配请求的路由的RouteData对象 |
HttpContextBase对象对一组描述当前请求的对象提供访问。RouteData对象描述了路由,下图描述了RouteData属性:
名称 | 描述 |
Route | 返回匹配路由的RouteBase实现 |
RouteHandler | 返回处理路由的IRouteHandler |
Values | 返回按名称索引的片段值的集合 |
运行效果如下图所示:
接受请求数据:
控制器经常需要访问来自于输入的请求的数据,如查询字符串值,表单值,以及由路由系统根据输入URL解析所得到得到参数。访问这些数据有三个主要途径:
1、通过一组上下文对象进行提取。
2、作为参数被传递给动作方法而形成的的数据。
3、明确地调用框架的模型绑定特性。
当控制器通过Controller基类派生而来的时候,使得到了一组便利属性,可以用来访问与请求相关的信息。这些便利属性包括Request,Reponse,RouteData、HttpContext,以及Server。每一个属性都包括了请求不同方面的信息,是因为每一个都是从请求的ControllerContext实例接受了不同类型的数据。这些属性统称为“便利属性”如下图所示:
属性 | 类型 | 描述 |
Request.QueryString | NameValueCollection | 随该请求发送的GET变量 |
Request.Form | NameValueCollention | 随该请求发送的POST变量 |
Request.Cookies | HttpCookieCollection | 由浏览器随该请求发送的Cookies |
Request.HttpMethod | sting | 用于该请求的HTTP方法(动词,如GET或者POST) |
Request.Headers | NameValueCollection | 随该请求发送的整个HTTP报头 |
Request.Url | Url | 所请求的URL |
Request.UserHostAddress | string | 形成该请求的用户IP地址 |
Request.Route | RouteBase | 为该请求所选择的RouteTable.Routes条目 |
RouteData.Values | RouteValueDictionary | 当前路由的参数(从URL或默认值提取) |
HttpContext.Application | HttpApplicationStateBase | 应用程序状态库 |
HttpContext.Cache | Cache | 应用程序缓存库 |
HttpContext.Items | IDictionary | 当前请求的状态库 |
HttpContext.Session | HttpSessionStateBase | 访问者会话状态库 |
User | IPrincipal | 已登录用户的认证信息 |
TempData | TempDataDictionary | 为当前用户存储的临时数据项 |
动作结果
MVC框架通过使用动作结果(Action Result)把指明意图 和 执行意图分离开来。一般都是返回一个派生与ActionResult类的对象,它描述控制器相应应该要完成的功能。例如,渲染一个视图,重定向到另一个URL或 动作方法等,在动作方法被执行后,创建MVC框架处理的ActionResult对象以产生结果。MVC框架有许多内建的动作结果类型,如下图所示:
类型 | 描述 | 辅助器方法 |
ViewResult | 返回指定的或默认的视图模板 | View |
PartialViewResult | 返回指定的或默认的分部视图模板 | PartialView |
RedireToRouteResult | 将HTTP 301或者302重定向发给一个动作方法或特定的路由条目,根据路由配置生成一个URL | RedirectToAction RedirectToActionPermanent RedirectToRoute RedirectToRoutePermanent |
RedirectResult | 将HTTP301或302重定向发送给一个特定的URL | Redirect RedirectPermanent |
ContentResult | 返回原始的文本数据给浏览器,随意设置文本类型头部 | Content |
FileResult | 将二进制(例如,磁盘文件或内存字节数组)直接传送给浏览器 | File |
JsonResult | 将一个.NET对象序列化成JSON格式,发送给响应 | Json |
JavaScriptResult | 发送一个由浏览器执行的JavaScript源代码偏度 | JavaScript |
HttpUnauthorizedResult | 将响应的HTTP状态码设置为401(意味“未授权”),这会引发当前的认证机制(表单认证或Windows认证)要求访问者进行登录 | None |
HttpNotFoundResult | 返回一个HTTP的“404——未找到”错误 | HttpNotFount |
HttpStatusCodeResult | 返回一个指定的HTTP码 | None |
EmptyResult | 什么也不做 | None |