码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET MVC之Controller学习2

时间:2014-12-04 12:01:31      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   sp   for   on   

 

实现自己的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

bubuko.com,布布扣

成功实现了自己手写的一个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已经成功实现了

bubuko.com,布布扣

 

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学习2

标签:style   blog   http   io   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/ilooking/p/4142212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!