ASP.NET MVC之Controller学习2
2014-12-04 10:31
204 查看
实现自己的Controller
平常定义的Controller都继承自Controller类,Controller类又继承ControllerBase,其最后又实现了IController接口public interface IController { void Execute(RequestContext requestContext); }
实现自己的Controller
在Controller文件夹中新建一个类,取名为MineController,让后实现IController接口
public void Execute(System.Web.Routing.RequestContext requestContext) { DateTime time = requestContext.HttpContext.Timestamp; string action = requestContext.RouteData.Values["action"].ToString() ; requestContext.HttpContext.Response.Write(string.Format("时间{0},action name{1}", time.ToString(), action)); }
在浏览器中输入http://localhost:8398/Mine/Index
成功实现了自己手写的一个Controller控制器
当然在实现控制器的时候,我们还是继承 Controller 抽象类
数据的交互
Controller获取数据的三种途径主要为1.一系列的上下文对象2.传递给Action方法的参数3.显示的调用框架的模型绑定(Model Binding)特性上下文对象:Request、Response、RouteData、HttpContext 和 Server
Controller抽象类中封装了主要的上下文对象public HttpContextBase HttpContext { get; } public HttpRequestBase Request { get; } public HttpResponseBase Response { get; } public HttpServerUtilityBase Server { get; } public HttpSessionStateBase Session { get; }
当然我们可以像在webform中那样Request.Form,request.Querystring的形式去获取值
传递给Action的参数
在第一种方法中我们通过获取上下文信息的方式来获取数据,在mvc中封装了更强大的获取信息的方式,我们只要在Action的方法中传入参数就可以获取其值DateTime time = requestContext.HttpContext.Timestamp; string action = requestContext.RouteData.Values["action"].ToString() ;
通过mvc的封装,我们可以改写成
public ActionResult Index(DataTime time,string action) { }
而且这种简洁的方式还不用区分其大小写
为什么可以通过这种方式进行传值:
Controller 类通过 MVC 框架的 value provider 和 model binder 组件来为 Action 方法获取参数的值。
value provider 提供了一系列Controller中可以访问到的值,在内部它通过从 Request.Form、Request.QueryString、Request.Files 和 RouteData.Values 等上下文对象中提取数据(键值集合),然后把数据传递给 model binder,model binder 试图将这些数据与Action方法的参数进行匹配。默认的 model binder 可以创建和赋值给任何.NET类型对象参数(即 Action 方法的参数),包括集合和自定义的类型。
实现自己的ActionResult
在Controller中定义了很多的ActionResult,下面我们就自己实现自己的ActionResult,我们先看看抽象类ActionResult中有什么?public abstract class ActionResult { protected ActionResult(); public abstract void ExecuteResult(ControllerContext context); }
看来要实现ActionRsult,继承后主要是要重写ExecuteResult的方法,我们新建一个类MyActionResult
public class MyActionResult:ActionResult { public override void ExecuteResult(ControllerContext context) { string controller = context.RouteData.Values["controller"].ToString(); context.HttpContext.Response.Write(string.Format("控制器名称{0}", controller)); } }
控制器中我们新建一个Actionresult
public ActionResult testMyController() { return new MyActionResult(); }
在浏览器中输入http://localhost:8398/Login/testMyController
可以看到我们自定义的ActionResult已经成功实现了
Action传递数据到view视图中
前面已经介绍了从view视图传递数据到action的的几种方式,现在来总结一下action传递数据到view中去的几种方法ViewModel对象
public ActionResult testMyController() { DateTime time = DateTime.Now; return View(time); }
@model DateTime @{ ViewBag.Title = "testMyController"; } <h2>testMyController</h2> <span>the day is @Model.DayOfWeek</span>
在前台@model 的作用是声明 model 属性的类型,省去了类型转换的麻烦,而 @Model 是View Model 对象的引用。
还有几种方式ViewBag、ViewData 和 TempData 属性
相关文章推荐
- ASP.NET MVC学习笔记-Controller与View传值
- Asp.net MVC 学习笔记 (3) --Controller 与View 之间的数据传递
- ASP.NET MVC 个人学习笔记之 Controller传值
- ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
- ASP.NET MVC学习(二)之控制器Controller
- asp.net mvc的Routing、Controller、Filter学习笔记
- ASP.NET MVC学习笔记-Controller与View传值
- ASP.NET MVC 学习1、新增Controller,了解MVC运行机制
- Asp.net MVC的Controller激活理解【学习笔记】
- ASP.NET MVC:看 MVC 源码,学习:如何将 Area 中的 Controller 放到独立的程序集?
- 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例
- ASP.NET MVC 学习8、Controller中的Detail和Delete方法
- 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例
- ASP.NET MVC学习之高级Controller和Action
- ASP.NET MVC学习笔记-Controller与View传值
- asp.net mvc的Routing,Controller,Filter学习笔记
- asp.net mvc的Routing、Controller、Filter学习笔记
- 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例 【转】
- ASP.NET MVC学习笔记-Controller的ActionResult
- ASP.NET MVC学习二之 Controller