日期:2014-05-16  浏览次数:20815 次

Asp.Net MVC系列--进阶篇之controller(1)

通过实现接口IController完成一个controller

对于默认的路由:

routes.MapRoute(
                name: "Default",
                url:"{controller}/{action}/{id}",
                defaults: new { controller ="Home", action = "Index", id = UrlParameter.Optional }
           );


 

添加controller:

public void Execute(RequestContextrequestContext)
       {
           var controller = (string)requestContext.RouteData.Values["controller"];
           var action =(string)requestContext.RouteData.Values["action"];
           requestContext.HttpContext.Response.Write(
           string.Format("Controller: {0}, Action: {1}", controller,action));
 
       }


访问controller查看结果:


这是最简单的controller创建方式,但是通常不这样做,因为:

我们拿到的是RequestContext对象,需要手动去生成html写到Response里面返回客户端,代码将很难维护。

 

集成Controller类完成一个controller

一般的,每当我们新建一个controller,都是自动继承controller类,这个类主要帮我们完成两件事情:

1.      会从路由拿到requestContext对象,解析出action以及参数,并调用

2.      提供不同的resultcommand模式),返回给客户端

另外,我们还可以使用filter,完成不同的crosscutting的concern,后面章节会详细介绍。

由于引入了action和result的概念,使得我们的代码更容易单元测试,起码比我们自己继承IController接口,直接操作RequestContext对象容易很多。

 

controller示例:

 

public class DerivedController :Controller {
public ActionResult Index() {
ViewBag.Message = "Hellofrom the DerivedController Index method";
return View("MyView");
}
}


View代码:

@{
ViewBag.Title ="MyView";
}
<h2>MyView</h2>
Message: @ViewBag.Message


 

代码很简单,就是用Viewbag传值到View显示出来,Controller返回了最常用的result,ViewResult。

 

从controller获取客户端传值的方式

1.      从context object 直接提取

2.      通过参数传进来(由基类controller完成解析)

3.      通过model binding

 

context object常用的对象

Request.QueryString

从Get 请求的url中取

Request.Form

从Post请求的表单取

Request.Cookies

把值放在请求的cookie里带过来

RouteData.Route

从路由表里取注册的路由名

RouteData.Values

从路由表获取路由配置的匿名对象

HttpContext.Cache

应用程序缓存

HttpContext.Items

存储一些值,只在同一请求中使用(可以在httppipeline过程的不同module,handler,以及页面传递值)

HttpContext.Session

当前用户的session