我遵循本教程创建ASP.NET核心Web API,在关于添加控制器的部分中,本教程给出了替换控制器模板代码的代码.真正吸引我眼球的一件事是,在模板代码中,我得到:

TodoController : Controller

然后在我应该使用的教程代码中,我发现:

[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase

我非常想知道为什么Web API控制器必须从ControllerBase派生,而不是从Controller派生.为什么要这样做呢?

推荐答案

为什么Web API控制器需要从ControllerBase而不是Controller派生.

这不是严格必要的,只是更切题而已.Controller类派生自ControllerBase,并添加了一些仅用于支持视图的成员.

基本上:

public abstract class Controller : ControllerBase
{
    public dynamic ViewBag { get; }
    public virtual ViewResult View(object model) { }
    // more View support stuff
}

当您编写API时,ControllerBase会更好地满足您的需求,但两者都可以工作.

documentation个(强调我的):

不要通过从控制器类派生来创建web API控制器.控制器源于ControllerBase,并添加了对视图的支持,因此它用于处理网页,而不是web API请求.这条规则有一个例外:if you plan to use the same controller for both views and web APIs, derive it from Controller.

我似乎记得在第一次MVC迭代中没有ControllerBase,它是后来插入的.因此,命名/继承 struct 有点奇怪.

Asp.net相关问答推荐

缓存httpmessage内容

如何正确配置 IHttpModule?

创建一个供 ASP.NET 应用程序中的所有线程使用的静态 Regex 对象是否有效?

使用 C# 和 ASP.NET 从 Gmail/Hotmail/Yahoo 导入通讯簿

即使使用正确的 Accepts 标头,WebAPI 也不会返回 XML

为什么默认情况下不允许 GET 请求返回 JSON?

ASP.NET 在更新面板更新时显示正在加载...消息

ASP.NET 中的 <% %>(嵌入式代码块)

如何在 ASP.NET MVC3 中配置区域

ASP.NET vNext 与主机无关,这意味着什么?

无法序列化会话状态

如何在实体框架中添加表?

如何在 ASP.NET 中设置下拉列表项?

捕获的异常本身为 null !

如何在 .NET Core 中实现 DbContext 连接字符串?

如何将列表转换为数据表

如何判断字符串的第一个字符是否是字母,C#中的任何字母

IIS 是否执行非法字符替换?如果是这样,如何阻止它?

在 ASP.NET Web API 2 中禁用 *all* 异常处理(为我自己腾出空间)?

ASP.NET Web 窗体中的 jQuery 验证插件