Reputation: 51104
I am following this tutorial for creating an ASP.NET Core Web API, and in the section on adding a controller, the tutorial gives code to replace the template code for a controller. One of the things that really caught my eye was that in the template code, I get:
TodoController : Controller
Then in the tutorial code I'm supposed to use instead of that, I find:
[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase
I'm very interested to know why it is necessary to derive from ControllerBase
instead of Controller
for a Web API controller. Why is this done?
Upvotes: 149
Views: 64980
Reputation: 273766
why it is necessary to derive from
ControllerBase
instead ofController
for a Web API controller.
It is not strictly necessary, just more to the point. The Controller
class derives from ControllerBase
and only adds some members that are needed to support Views.
Basically:
public abstract class Controller : ControllerBase
{
public dynamic ViewBag { get; }
public virtual ViewResult View(object model) { }
// more View support stuff
}
When you write an API then ControllerBase matches your requirements better but both will work.
From the documentation:
Don't create a web API controller by deriving from the Controller class. Controller derives from ControllerBase and adds support for views, so it's for handling web pages, not web API requests. There's an exception to this rule: if you plan to use the same controller for both views and web APIs, derive it from Controller.
I seem to remember that there was no ControllerBase in the first MVC iterations, it was inserted later. Hence the slightly odd naming/inheritance structure.
Upvotes: 199
Reputation: 81
when you change a Controller to a ControllerBase the Index method below throws an error "Compiler Error CS0103", The name 'identifier' does not exist in the current context,
public IActionResult Index()
{
return View();
}
Upvotes: -3
Reputation: 6921
One other important difference is that ControllerBase is abstract class that's why it doesn't implement Dispose method. So you need to handle yourself. see this SO entry
Upvotes: -1
Reputation: 311
FROM https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1
Don't create a web API controller by deriving from the Controller class. Controller derives from ControllerBase and adds support for views, so it's for handling web pages, not web API requests.
Upvotes: 31