ASP.NET MVC3中的Controller

     在ASP.NET MVC中,Controller的任务正如其名称所言,就是控制整个网站处理流程:接收到用户发出的URL请求后,找到合适的数据,找到回复给用户信息的合适的输出模块,并把数据传递给该模块。至于数据如何得到,输出模块如何输出给用户,这些不是它所关注的。
     所以,我们猜测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主要包括了通过路由系统传入的相关数据;
     详细信息如下表:
     

     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的子类及意义如下:
  


     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);
     }



猜你喜欢

转载自blog.csdn.net/FrancisLaw/article/details/7432655