asp.net mvc(二) 控制器
其实在第一篇博文中已经说道过 控制器。 下面来比较深入的说一说。
控制器动作
ASP.NET MVC框架支持六种标准类型的动作结果:
- ViewResult – 代表HTML及标记。
- EmptyResult – 代表无结果。
- RedirectResult – 代表重定向到一个新的URL。
- RedirectToRouteResult – 代表重定向到一个新的控制器动作。
- JsonResult – 代表一个JSON(Javascript Object Notation)结果,它可以用于AJAX应用程序。
- ContentResult – 代表着文本结果。
1. 就是列子中的
return View();
当然。 很多时候 你并不是直接返回一个动作, 而是调用基类中的方法
- View – 返回一个ViewResult结果。
- Redirect – 返回一个RedirectResult 动作结果。
- RedirectToAction – 返回一个RedirectToAction动作结果。
- RedirectToRoute – 返回一个RedirectToRoute动作结果。
- Json – 返回一个JsonResult动作结果。
- 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 |
|
HttpContext.Application |
HttpApplicationStateBase |
应用程序状态库 |
HttpContext.Cache |
Cache |
应用程序缓存库 |
HttpContext.Items |
IDictionary |
当前请求的状态库 |
HttpContext.Session |
HttpSessionStateBase |
访问者的会话状态库 |
User |
IPrincipal |
已登录用户的认证信息 |
TempData |
TempDataDictionary |
为当前用户存储的临时数据项 |
大概就是这样传值的。
end。
其实 控制器不止这么简单。 下回分解吧。