在ASP.NET MVC中,Controller的任务正如其名称所言,就是控制整个网站处理流程:接收到用户发出的URL请求后,找到合适的数据,找到回复给用户信息的合适的输出模块,并把数据传递给该模块。至于数据如何得到,输出模块如何输出给用户,这些不是它所关注的。
void Execute(RequestContext requestContext);
}
![]()
![]()
![](https://img-my.csdn.net/uploads/201204/06/1333699457_6659.png)
![]()
所以,我们猜测Controller至少要完成以下几点关键任务:
1,接受用户发出的Request,即用户的相关需求,以及用户所提供的一些信息,开发者可利用这些信息完成后续的任务;
2,向输出模块通过某种方式传递数据;
一,自定义Controller:
任何Controller都要继承IController接口:
public interface IController
{void Execute(RequestContext requestContext);
}
1,RequestContext请求上下文,各种关于请求的信息全在这里;
2,当有request需要处理时,.net通过路由系统映射出用来处理该URL的Controller,然后调用Controlelr里的Execute方法执行一些操作。(操作之一就是把requestContext信息保存下来吧。)
二,通过继承System.Web.Mvc.Controller来创建Controller
主要关注以下三个要素:
ActionMethods();URL请求通过路由系统定位到最后的方法,并根据相应的参数来执行;
ActionResults;方法执行后返回的结果
Filters:即C#中的Attribute,可以实现对Controller,Method,Result,的相关约束;
1,接受传入数据(用户请求信息):
可以通过三种途径:传入Controller里的Context参数;ActionMethod里的相关参数;ModuleBinding
a,通过Context参数,和WebForm相似,通过Request, Response, RouteData,HttpContext and Server这些属性去获得相关的用户请求信息,其中RouteData主要包括了通过路由系统传入的相关数据;
详细信息如下表:
![](https://img-my.csdn.net/uploads/201204/06/1333699422_5042.png)
b,通过ActionMethod里的参数获取相关传入的信息:
// 通过context相关属性来获得
public ActionResult ShowWeatherForecast()
{
string city = RouteData.Values["city"];
DateTime forDate = DateTime.Parse(Request.Form["forDate"]);
// 相关处理语句
}
// 直接通过ActionMethod里设置参数来获取相关数据
public ActionResult ShowWeatherForecast(string city, DateTime forDate)
{
// 相关处理语句
}
MVC会通过查询Request.QueryString, Request.Form,RouteData.Values里去搜寻和方法参数相匹配的数据(大小写不敏感),并传递给方法的参数,然后调用方法。
.net通过:value providers系统来收集传入的数据,然后把数据传给ModuleBinder,binders通过对比参数类型,生成参数对象实例。最终完成向ActinoMethod传递参数;
当传入的数据不能和Action方法相匹配时,如果是引用类型的参数,方法将继续调用,此时该参数值为null;如果是值类型的参数,如果没有指定默认值(或者不为可空值类型时),方法不会被调用,抛出异常;
c,通过ModuleBind方法,通过把某个Module和某些数据绑定起来,在需要该module的实例时,会自动生成,在后面的Modules介绍里会详细介绍;
二,输出结果:
两种方式:
1,通过Respon.write或者Redict()或者返回String等直接向浏览器输出结果;
2,通过ActionResults不直接向浏览器返回结果,而是返回到其他模块中;
Controller通过返回ActionResults来告诉.net我们想要完成什么任务,.net之后会调用ActionResult里的ExecuteResult来执行;
ActionResult的子类及意义如下:
![](https://img-my.csdn.net/uploads/201204/06/1333699442_1238.png)
![](https://img-my.csdn.net/uploads/201204/06/1333699457_6659.png)
3,在Action Method里向view传递数据
①将所有需要传入的数据作为一个对象传入VIEW()方法的参数里。在对应的view里,通过@Module对象来获得;(注意此方法传入的数据只能是一个对象,当有多个对象需要传递时,需要把这些对象组合成一个对象)
②通过ViewBag;在对应的View里通过@ViewBag来获得;ViewBag是一个动态对象,错误只有在运行时才能发现;
③通过ViewData;ViewDta是一个ViewDataDictionary,和Dictionary类似,通过KEY/VALUE来存取
4,重定向redirect:此时相当于控制用户浏览器发出一个新的URL请求,这之前的请求的相关信息将不能在再获得;
①通过redirect("")方法来实现临时定向;
②通过RedirectToRoute()方法实现通过路由系统的重定向
③通过RedirectToAction()重定向到方法
5,通过TempData来临时保存数据:redirect重新定向页面,即不能获得原来request的信息,若需要临时保存数据供后面的页面使用,通过TempData[""]来保存。类似Session,但TempData里的数据会被自动清除;
6,return text类型的数据:Josn有专门的方法;其他的text的返回类型可通过Content
return Content(message, "text/plain", Encoding.Default);
7,return File;
public FileResult AnnualReport()
{
string filename = @"c:\AnnualReport.pdf";
string contentType = "application/pdf";
string downloadName = "AnnualReport2011.pdf";
return File(filename, contentType, downloadName);
}