ASP.NET Core MVC 中的 [Controller] 和 [NonController]

简介:

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 了。






      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1928956,如需转载请自行联系原作者


相关文章
|
14天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/Scrutor>
36 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
41 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
22天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
2月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
35 1
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
111 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
60 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
214 0