Using MVC and Web API Controllers in ASP.NET Core

Those familiar with ASP.NET will know that before the advent of ASP.NET Core we had two frameworks – MVC and Web API. When you wanted to return data responses in a format such as JSON you’d use a Web API controller.

To create a Web API controller in ASP.NET Web API 2, you’d create a controller that inherits from ApiController. This is a part of the System.Web.Http assembly.

Then, when you wanted to render a view, you’d use an MVC controller. To create an MVC controller in ASP.NET MVC, you’d create a controller that inherits from Controller, which is a part of the System.Web.Mvc assembly.

With the release of ASP.NET Core, the ASP.NET MVC framework and ASP.NET Web API framework have been unified under the ASP.NET Core MVC framework. This has combined components such as controller, actions, model binding, filters, dependency injection, and routing.

Here we’re going to take a look at the different ways we can now create a controller in ASP.NET Core.

Controllers

When you create a new ASP.NET Core MVC application, you’ll notice that controllers are still put into the Controllers folder in the root of the application by default. In the Controllers folder you’ll have an example controller called HomeController that inherits from Controller. The inherited Controller class comes from the new Microsoft.AspNetCore.Mvc assembly.

You’ll notice that the HomeController example above contains several actions with a return type of IActionResult. While I won’t go too much into the different types of results an action can return, it's worth noting that IActionResult is an interface and ActionResult is an abstract class that other action results inherit from.

If we look at the Index action method, we can see it returns a View (ViewResult), which should be familiar from the ASP.NET MVC  controller example we discussed earlier. If we then change this action method to return an OkResult object — which matches the return type from our ASP.NET Web API 2 controller — add a [HttpGet] attribute, you’ll notice that when we build this code the compiler is happy. This is the power of the new ASP.NET Core MVC framework: allowing us to return a View (MVC) or Object (Web API) from a single unified controller.

One of the new features in ASP.NET Core MVC allows us to create plain old CLR object classes (POCO) as controllers using built-in convention. This means our Controller class does not need to inherit from the abstract Controller class in the Microsoft.AspNetCore.Mvc assembly. Our Controller class must be public and the class name should be suffixed with “Controller”. Our Controller class must also be defined in an assembly that references one of the ASP.NET Core MVC assemblies such as Microsoft.AspNetCore.Mvc.

In the POCO controller example above, it is also possible to drop the “Controller” suffix by applying the [Controller] attribute to the top of our Controller class:

So what happens if you create a class with the “Controller” suffix but you don’t want it to be picked up as a POCO Controller? This is where the [NonController] attribute comes in. By applying the [NonController] attribute to a class with the “Controller” suffix it will not be picked up as a POCO controller.

Conclusion

I hope this has given you a basic understanding of how you can create MVC and Web API controllers using the new, unified approach in ASP.NET Core 2.

Resources

Handle requests with controllers in ASP.NET Core MVC
Controller action return types in ASP.NET Core Web API
Create a Web API with ASP.NET Core and Visual Studio Code