关于控制器

控制器是mvc中的核心,负责处理浏览器传来的所有要求,并决定响应什么属性给浏览器。

控制器本身就是一个类,该类别有许多方法,这些方法中只要是公开方法public,就会被视为一个动作action或动作方法,只要有动作存在,就可以通过动作方法接收客户端传来的要求与决定响应器响应的检视。

基本要求:

控制器必须为公开类别

名称必须以Controller结尾

必须继承自asonet mvc内建的Controller类别,或继承有实作IController界面的自定义类别,或者自行实作IController界面

所有动作方法必须为公开方法,任何非公开的方法如申明private 或者protected的方法都不会被视为一个动作方法。

当控制器被MvcHandler(MH)选中之后,下一步就是通过ActionInvoker(AI)选定适当的Action来运行,在控制器中的每一个Action可以定义0到多个参数,AI会依据当下的RouteValue与客户端传来的数据准备好可传入Action参数的数据,最后正式调用Controller中被选中的那个Action方法。

参数传入的属性都是通过一种称为模型绑定Model Binding机制,从RequestContext取得数据,并将数据对应或传入方法的参数中,让Action不用再像之前asp或aspnet webform中经常使用的Request.Form 或Request.QueryString等对象来取得客户端的数据,通过自定义的模型绑定,甚至可以让你对应出了Request.Form或Request.QueryString以外的数据来源,例如HTTP Cookies,HTTP Headers等

Action运行完后的回传值通常是ActionResult类别或其衍生类别(Derived Classes)事实上,ActionResult是一个抽象类。因此,mvc本身就实作了许多不同类型的Actionresult的子类别,

例如ViewResult用来回传一个View ,

RedirectResult用来将网页转向其他网址,

ContentResult回传一个文字属性,

FileResult回传一个二进制的文档,

这些都是集成自ActionResult的类型。

MH从控制器得到ActionResult之后,就会开始运行ActionResult提供的ExecuteResult方法,并将运行结果响应到客户端,这时控制器的任务就算完成。

不过控制器在运行时还有一层所谓的动作过滤器机制

授权过滤器,动作过滤器

结果过滤器,例外过滤器

所以控制器的运行过程还必须考虑到动作过滤器的运行顺序

当AI找不到对应Action动作时,默认就会运行到System.Web.Mvc.Controller类别的HandleUnknowAction方法,这个方法默认会响应HTTP 404找不到资源的错误信息。

而在控制器的这个基类里面,HandleUnknowAction被标注为virtual虚的,代表这个方法可以被替换override,因此可以在项目的控制器中替换HandleUnknowAction方法,就可以自定义当找不到对应的action时的处理方式,。

eg:

protected override void HandleUnknowAction(string actionname){

Response.Redirect(url);

}

如果在Action前加上ActionName属性并指名为aaa,那么路由参数action的值就会变成必须是aaa才会正确运行到这个对应的动作方法,同时如果去return view()的话,mvc会去寻找aaa.cshtml这个页面,而不是action名称对应的页面,就相当于对这个动作方法名称作了变更。

[ActionName("aa")]

public ActionResult Index(){

return View();

}

NonAction属性

若套用NonAction属性在控制器的动作方法上时,即便该action是public,也会被告知ActionInvoker不要选定这个action来运行,这个属性的用途:为了保护控制器中的特定公开方法不要发布到web上,或是功能尚未开发完整就要进行部署,暂时不想删除就可以套用这个属性不要对外公开。

[NonAction]

public ActionResult Index(){

return View();

}

将Action方法的public更改为private也可以达到这个效果。

时间: 2024-10-12 06:24:23

关于控制器的相关文章

LCD实验学习笔记(八):中断控制器

s3c2440有60个中断源(其中15个为子中断源). 程序状态寄存器(PSR)的F位设为1,禁用快速中断(FRQ). 程序状态寄存器(PSR)的I位设为1,禁用普通中断(IRQ). 相反,PSR寄存器F位为0开FRQ中断,I位为0开IRQ中断. s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND). SRCPND寄存器各位对应不同的中断,其中外部

梳理版本控制器:SVN和Git比较

在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?今天在此详细记录下: SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别. Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应Git提供的一些概念和特征. 先来说说集中式版本控制系统: 版本库是集中存放在中央服务器的,而干

Json&Razor&控制器

JsonJson 属于JavaScript所以要书写在<script></script>中1.语法规则: 1.1:键值对 1.2:逗号分隔 1.3:花括号保存对象 1.4:方括号保存数组JSON的值可以为NULL2.JSON对象是在花括号内书写(键值对"{ "name":"小王" , "url":"www.xiaowang.com" }")3.使用数组的话则是用方括号包裹每个JSON

基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计

自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的细节,本文主要介绍整个Web开发框架中的MVC控制器的设计.在设计之初,我就希望尽可能的减少代码,提高编程模型的统一性.因此希望能够以基类继承的方式,和我Winform开发框架一样,尽可能通过基类,而不是子类的重复代码来实现各种通用的操作. 1.登录控制的控制器基类设计 我们知道,一般我们创建一个MVC的控制

基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思路和特点,对Controller进行了封装.使得控制器能够获得很好的继承关系,并能以更少的代码,更高效的开发效率,实现Web项目的开发工作,整个控制器的设计思路如下所示. 从上图的设计里面可以看到,我把主要能通过抽象封装的CRUD方法都放到了BusinessController<B, T>类里面,

CI3.0控制器下面建文件夹 访问一直404 的解决方法

在单入口文件(框架目录下面的index.php)最下面的require_once BASEPATH.'core/CodeIgniter.php';这行上面设置一个路径,是相对于conrollers文件夹的,你这里这样写:$routing['directory'] = './home/';(这里的home是控制器里的子目录),然后在路由配置文件那里填$route['default_controller'] = 'home';

3 控制器设计

原文链接 控制器设计 基于roll, pitch, yaw的传递函数表达的系统的线性数学模型 使用Matlab仿真工具设计了一个闭环控制器. 首先,在Matlab脚本里面定义系统模型的常量. %% Constants d = 0.45; % diameter quadrocopter l = sqrt(d^2/8); % distance between one rotor and center of mass m = 1.0024; % mass of quadrocopter g = 9.8

MVC学习笔记——控制器

一.创建新的控制器 操作:选中Controllers文件夹,右键Add/Controller,然后给予命名eg:StoreController 判断:一个类是否为控制器类:该类是否继承自using System.Web.Mvc.Controller 明确:模型和视图虽然非常有用,但是控制器才是真正的核心,每个请求都必须通过控制器处理,它是MVC应用程序的“指挥员”! 代码演示: using System; using System.Collections.Generic; using Syste

AngularJS 外部文件中的控制器

在大型的应用程序中,通常是把控制器存储在外部的文件中. <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="X-UA-Compatible"content="IE=edge" /> <me

MVC控制器给View返回实体

前言 这几天把vs12更新到了vs12 5了,因为发现我之前装的12有问题,没有mvc,之后就从itellyou上下载了12的update5更新了一下.说实话,从开发到现在,自己只是平时自己玩用mvc+ef,接触的项目倒是没有用过.很明显现在的自己跟12年乃至13年的自己比确实不是一个水准的(吹一下自己),说明自己是进步了,但是进步的幅度并不大,要是大就该像大牛靠拢了,其实离那个地方很远很远很远... 正文 今天只是做个测试,提取一下数据.mvc4生成网站,然后建一个Ef类库,随便写个Index