一般我们用mvc开发程序时一般需要三个步骤,

创建模型、创建控制器、创建视图

之前开发程序都是按照这样的步骤来开发的,也没有想过mvc的原理,比如route是怎么找到controller的,controller又是怎么找到action的,actionResult又是怎么输出到view中去的,

本篇文章结合自己所学知识讲解controller和action,至于route-->controller-->action这段部分将放在下骗随笔讲解。

一:controller类执行原理

当我们新建立一个控制器的时候会发现它是继承Controller类的,而Controller又是继承ControllerBase的,转到ControllerBase的定义如下图

我们发现ControllerBase类是继承IController接口,IControlle接口只有一个Execute方法,而Execute方法在ControllerBase类中已经实现,写了这么多其实可用一句话可以概括

controller 中一切对请求的处理都是从 Execute 方法开始.

   备注:Controller工厂维护了一个Controller类列表,这个列表类必须满足其中一个条件就是:Controller必须是直接或间接继承

IController接口,我们创建控制器继承的Controller已经继承了ControllerBase类,ControllerBase类已经继承并实现了IController接口

   我们可以做个demo验证一下:

   

   继承了IController的BasicController类,Controller工厂是可以找到并创建它的实例的,这样一个简单的Controller类就写完了.当时它并不适合在实际项目中适用.

二:理解ActionResult

一般我们简单的在Controller中实现一个ActionResult我们通常这样写

        public ActionResult Index()
{
return View();
}

mvc将会转到Index视图,可是mvc是怎么做到的呢,我们可以查看ActionResult的定义,

    public abstract class ActionResult
{
protected ActionResult();
public abstract void ExecuteResult(ControllerContext context);
}

我们发现ActionResult里面有一个可重写的ExecuteResult方法,这个方法就是关键,一旦Controller执行ActionResult方法时,ActionResult类里面的ExecuteResult将会被调用..

我们做个demo测试一下

    public class CustomReditect : ActionResult
{
public string url { get; set; } //重写ActionResult的ExecuteResult方法
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.Redirect(url);
}
} public class DefaultController : Controller
{
public ActionResult Index()
{
return new CustomReditect{url="/Redir/Index"};//这里是关键
}
}

最后总结一下Execute和ExecuteResult两个方法:

一:mvc一切请求都是从execute方法开始的

二:一切继承ActionResult的类都是从ExecuteResult开始的。

MVC中Controller和Action讲解上篇的更多相关文章

  1. ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

    我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...

  2. ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

    在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...

  3. Asp.Net MVC中Controller、Action、View是如何激活调用的

    上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...

  4. Asp.net MVC 中Controller返回值类型ActionResult

    [Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...

  5. MVC 中Controller返回值类型ActionResult

    下面列举Asp.net MVC中Controller中的ActionResult返回类型 1.返回ViewResult视图结果,将视图呈现给网页 public ActionResult About() ...

  6. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  7. dotNET开发之MVC中Controller返回值类型ActionResult方法总结

    1.返回ViewResult视图结果,将视图呈现给网页 2. 返回PartialViewResult部分视图结果,主要用于返回部分视图内容 3. 返回ContentResult用户定义的内容类型 4. ...

  8. MVC中Controller控制器相关技术

    第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...

  9. Asp.net MVC中 Controller 与 View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...

随机推荐

  1. ibatis返回结果映射到HashMap时,列名无效的问题

    遇到问题: 1.项目开发过程中在xml配置文件中使用$tableName/sql$时,报"列名无效"错误,后来经过查询,发现是ibatis缓存 了上一次查询的表结构的原因.解决办法 ...

  2. 在IIS7.5上添加.NET4.0程序的虚拟目录时提示ASP.NET 4.0尚未在 Web 服务器上注册

    使用VS2010创建web应用程序时出现如下提示: ASP.NET 4.0尚未在 Web 服务器上注册. 解决方法: 首先IIS应用程序池添加 net framework4.0版本. 接着找到C:\W ...

  3. LeetCode 213

    House Robber II Note: This is an extension of House Robber. After robbing those houses on that stree ...

  4. hdu 4606 简单计算几何+floyd+最小路径覆盖

    思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径.二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边.然后求一次最小路径覆盖 ...

  5. MySQL数据库的存储结构

    --把若干条sql语句封装起来,起个名字,叫做过程,也是没有返回值的函数 --把这个过程存储在数据库中->存储过程 --存储过程的创建过程 create procedure proceduceN ...

  6. 有些方法为什么会声明称static静态的

    有些方法在调用的时候,没有必要都要先实例化一下,只需要:[类名. 静态方法 ]就行了. 哪些方法的调用没有必要实例化呢?网上找了个例子: 举个例子:Car类,1.静态方法Run(),Car.Run() ...

  7. 存储过程往拼接的sql语句中传递日期值

    存储过程往拼接的sql语句中传递日期值 declare @start datetime declare @end datetime set @start='2014-3-1' set @end='20 ...

  8. 生成 网站“面包屑” XML

    using System; using System.Collections.Generic; using System.IO; using System.Threading; using Syste ...

  9. JavaScript学习笔记(12)——JavaScript自定义对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. JavaScript---Cookie

    用JavaScript创建.获取.删除Cookie的例子 1.创建cookie function setCookies(cName,cValue,exTimes){ var d = new Date( ...