asp.net mvc(二) 控制器

 其实在第一篇博文中已经说道过 控制器。 下面来比较深入的说一说。

控制器动作

ASP.NET MVC框架支持六种标准类型的动作结果:

  1. ViewResult – 代表HTML及标记。
  2. EmptyResult – 代表无结果。
  3. RedirectResult – 代表重定向到一个新的URL。
  4. RedirectToRouteResult – 代表重定向到一个新的控制器动作。
  5. JsonResult – 代表一个JSON(Javascript Object Notation)结果,它可以用于AJAX应用程序。
  6. ContentResult – 代表着文本结果。

 1. 就是列子中的 

return View();

 

当然。 很多时候 你并不是直接返回一个动作, 而是调用基类中的方法

  1. View – 返回一个ViewResult结果。
  2. Redirect – 返回一个RedirectResult 动作结果。
  3. RedirectToAction – 返回一个RedirectToAction动作结果。
  4. RedirectToRoute – 返回一个RedirectToRoute动作结果。
  5. Json – 返回一个JsonResult动作结果。
  6. Content – 返回一个ContentResult动作结果。

 

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "欢迎使用 ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            //return View();
            ViewData["Message"] = "欢迎使用 ASP.NET MVC_About!";
            return View("index");
        }
    }

还是拿 初始这里例子说事儿

一个控制器是一个继承自System.Web.Mvc.Controller基类的类,因为控制器继承自这个基类

 

MVC框架中,控制器类必须实现System.Web.Mvc命名空间的IController接接口

public interface IController {
    void Execute(RequestContext requestContext);
}
        public void Execute(System.Web.Routing.RequestContext requestContext)
        {
            string controller = (string)requestContext.RouteData.Values["controller"];
            string action = (string)requestContext.RouteData.Values["action"];
            requestContext.HttpContext.Response.Write(
                    string.Format("Controller: {0}, Action: {1}", controller, action));
        }

结果就是这样

这样说。  IController实现的这个类 Execute  MVC会将他当做一个控制器,RequestContext 讲请求传过去

所以我推测 Controller - ControllerBase - IController; 在Controller 解析之后 然后分配到 对应的类。

protected virtual void Execute(RequestContext requestContext)
{
    if (requestContext == null)
    {
        throw new ArgumentNullException("requestContext");
    }
    this.VerifyExecuteCalledOnce();
    this.Initialize(requestContext);
    this.ExecuteCore();
}
protected override void ExecuteCore()
{
    this.PossiblyLoadTempData();
    try
    {
        string requiredString = this.RouteData.GetRequiredString("action");
        if (!this.ActionInvoker.InvokeAction(base.ControllerContext, requiredString))
        {
            this.HandleUnknownAction(requiredString);
        }
    }
    finally
    {
        this.PossiblySaveTempData();
    }
}

 这是反编译的结果。 所以理论上 只要你继承了 IController接口, 你可以不用去继承 Controller。 完全自己写。

 

控制器 传入参数。

1. 这是一种方式。 通过Url 传值

    public class BlogsController : Controller
    {
        //
        // GET: /Blogs/
        public ActionResult Archive(string year)
        {
            ViewData["Message"] = year;
            return View();
        }
    }

 

 2. 常用方法获取

 

属性

类型

描述

Request.QueryString

NameValueCollection

请求的GET变量

Request.Form

NameValueCollection

请求POST变量

Request.Cookies

HttpCookieCollection

由浏览器用这个请求发送的Cookies

Request.HttpMethod

string

用于这个请求的HTTP方法(动词,如GET或POST)

Request.Headers

NameValueCollection

请求的整个HTTP头

Request.Url

Uri

请求的URL

Request.UserHostAddress

string

发送请求的用户的IP地址

RouteData.Route

RouteBase

为这个请求所选择的RouteTable.Routes条目

RouteData.Values

RouteValueDictionary


当前路由的参数(或是从URL提取的,或是默认值)

HttpContext.Application

HttpApplicationStateBase

应用程序状态库

HttpContext.Cache

Cache

应用程序缓存库

HttpContext.Items

IDictionary

当前请求的状态库

HttpContext.Session

HttpSessionStateBase

访问者的会话状态库

User

IPrincipal

已登录用户的认证信息

TempData

TempDataDictionary

为当前用户存储的临时数据项

 

大概就是这样传值的。

 

end。

其实 控制器不止这么简单。 下回分解吧。

posted @ 2012-05-19 20:31  CallMeTommy  阅读(365)  评论(0编辑  收藏  举报