ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言
我们知道,在 MVC 应用程序中,有一部分约定的内容。其中关于 Controller 的约定是这样的。
- 每个 Controller 类的名字以 Controller 结尾,并且放置在 Controllers 目录中。
- Controller 使用的视图是在 Views 主目录的一个子目录中,这个子目录是根据控制器名称(后面减去Controller后缀)来命名的。
明白了以上约定之后,就来一起看看下面吧。
Controller VS NonController 中内置的约定
在 ASP.NET Core MVC 中已经统一了 MVC 和 Web Api 及 Web Pages, 他们具有相同的 Controller ,并且在 RC2 之后的版本中,ASP.NET Core MVC 支持了 POCO Controller,所以你在做一个 Web Api 的 Controller 的时候不需要再继承自 Controller 基类。
POCO Controller 即 public 的,非抽象的,没有任何继承,不实现任何接口的 Controller 类,类似于 POCO Class,仅仅是以 Controller 结尾而已。
到这里,有些同学可能会问了,在 POCO Controller 中如果我想获取 HTTP 上下文的一些东西应该怎么获取呢? 嗯?。。。 这确实是个问题。。。。怎么办呢? 老实的继承基类 Controller 吧,因为 Vnext 中的 POCO Controller 属性注入已经被取消了。
如果你创建了一个 POCO Controller ,那么他们的名字必须以 Controller 结尾,只有这样他们才是一个有效的 Controller,不然的话,MVC 不会认为你这是一个 Controller 对象。即使你具有 Route 之类的标记也不可以。
所以,在创建一个 MVC Controller 的时候,就有两个先决条件:
- -- 继承自 Controller 基类
- -- 或者使用一个以 Controller 结尾的名字
下面是创建两种 Controller 的一个 Web Api Controller示例:
[Route("api/[controller]")]
public class FooController : Controller
{
[HttpGet]
public string Get()
{
return "foo";
}
}
[Route("api/[controller]")]
public class BarController
{
[HttpGet]
public string Get()
{
return "bar";
}
}
现在有同学可能会问了,第一个既然已经继承了 Controller 基类,再在定义 Controller 的时候还要加 Controller 后缀不是多此一举么?这样写可不可以呢?
[Route("api/[controller]")]
public class Foo : Controller
{
[HttpGet]
public string Get()
{
return "foo";
}
}
好吧,这样子也是正确的。为什么呢?这是因为继承的基类 Controller 已经被打上了 ControllerAttribute 的标记,打上了这个标记之后,在构建扫描的时候就会被认为是一个 Controller,也就是说整个继承树已经被认为是一个有效的 MVC Controller 了。
那么,有同学又问了,这样可不可以呢?
[Route("api/[controller]")]
public class Bar
{
[HttpGet]
public string Get()
{
return "bar";
}
}
这样子是不行的,因为这是一个 POCO Controller,没有任何标记使 MVC 框架会认为这是一个有效的Controller,这个时候,如果 如果想让框架认为这是一个有效的 Controller,可以通过添加 ControllerAttribute 的方式:
[Controller]
[Route("api/[controller]")]
public class Bar
{
[HttpGet]
public string Get()
{
return "bar";
}
}
这个时候,MVC 框架就会认为这是个有效的 Controller 了。
同样的,这样的代码也是有效的,因为基类已经有了 ControllerAttribute 标记 :
[Controller]
public class ApiBase {}
[Route("api/[controller]")]
public class Bar : ApiBase
{
[HttpGet]
public string Get()
{
return "bar";
}
}
还有一种可能性,就是当你有一个类,它恰好是以 Controller 结尾,但是实际上并不是一个 Controller 类怎么办呢? 这个时候,你就需要添加一个 NonControllerAttribute 标记,来声明当前的类并不是一个 MVC 的 Controller 类,从而避免在构建的时候,框架会认错。
[NonController]
public class DemoController
{
// 非 action 代码
}
有一点需要注意的是,NonControllerAttribute 标记比 ControllerAttribute 具有更高的优先级,所以当一个 Controller 同时具有这两个标记的时候,会以 NonControllerAttribute 为准。
实际上,只要是整个 Controller 继承树中有一个 Controller 被标记为 NonControllerAttribute 的时候,整个继承树的 Controller 均会被认为是无效的 Controller 了。
本文地址:http://www.cnblogs.com/savorboard/p/dontnet-controller.html
作者博客:Savorboard
欢迎转载,请在明显位置给出出处及链接
ASP.NET Core MVC 中的 [Controller] 和 [NonController]的更多相关文章
- 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行
我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...
- 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost
我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值
用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中
我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...
- ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...
随机推荐
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- ES6模块import细节
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
- ExtJS 4.2 组件的查找方式
组件创建了,就有方法找到这些组件.在DOM.Jquery都有各自的方法查找元素/组件,ExtJS也有自己独特的方式查找组件.元素.本次从全局查找.容器内查找.form表单查找.通用组件等4个方面介绍组 ...
- 运用php做投票题,例题
要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...
- C++随笔:.NET CoreCLR之GC探索(4)
今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 【Java大系】Java快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...
- Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)
作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...
- myrocks复制中断问题排查
背景 mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛.随着SSD逐渐普及,硬件存储成本越来越高,面向写优化 ...
- 2003-Can't connect to mysql server on localhost (10061)
mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...