Controllers are the heart of the Model-View-Controller (MVC) pattern in ASP.NET. They act as the intermediaries between the Model and the View, handling incoming browser requests, interacting with the Model to retrieve or manipulate data, and then selecting the appropriate View to render the response.
The Role of a Controller
In an ASP.NET MVC application, a controller is a class that inherits from the Controller
base class and contains public methods called action methods. These action methods are responsible for:
- Receiving and processing HTTP requests.
- Interacting with the application's data (e.g., fetching from a database, saving data).
- Selecting and returning an appropriate View to display to the user.
- Returning other types of HTTP responses, such as redirects or JSON data.
Creating a Controller
Controllers are typically located in a Controllers
folder within your project. Here's a simple example of a controller:
using Microsoft.AspNetCore.Mvc;
namespace MyWebApp.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
// This action method will typically return a View
return View();
}
public IActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public IActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
public IActionResult HelloWorld(string name)
{
if (string.IsNullOrEmpty(name))
{
name = "World";
}
return Content($"Hello, {name}!");
}
}
}
Action Methods
Action methods are public methods within a controller class. When a request comes in, the routing mechanism determines which controller and action method to execute based on the URL. Key characteristics of action methods:
- Must be public.
- Should return a type that implements
IActionResult
(or one of its derived types likeViewResult
,ContentResult
,RedirectResult
,JsonResult
, etc.). - Can accept parameters that are bound from the request URL, query string, form data, or request body.
Returning Different Response Types
View()
: Returns aViewResult
, which typically renders an HTML view.Content(string)
: Returns aContentResult
with plain text.RedirectToAction(string)
: Returns aRedirectResult
to another action method.Redirect(string)
: Returns aRedirectResult
to a specified URL.NotFound()
: Returns aNotFoundResult
(HTTP 404).Ok()
: Returns anOkResult
(HTTP 200).Json(object)
: Returns aJsonResult
containing JSON serialized data.
Action Method Parameters
ASP.NET Core MVC automatically attempts to bind incoming request data (from route values, query strings, form posts, etc.) to the parameters of your action methods. This makes it easy to pass data into your actions.
For example, in the HelloWorld
action above, the name
parameter can be provided in the URL like this:
/home/helloworld?name=Alice
/home/helloworld/Alice
(if routing is configured to support this)
Controller Naming Conventions
By convention, controller class names end with the suffix Controller
. For example, HomeController
, ProductsController
, AccountController
. The routing system automatically removes the "Controller" suffix when matching URLs.
Controller Actions and Routing
The MVC framework uses a routing system to map incoming URLs to specific controller actions. By default, a common convention is:
/{controller}/{action}/{id}
For example, a request to /home/about
would map to the About
action in the HomeController
.
[Route]
and [HttpGet]
, [HttpPost]
, etc., directly on controllers and action methods for more fine-grained control.
Conclusion
Controllers are fundamental components in ASP.NET MVC applications. They are responsible for handling the logic of incoming requests, orchestrating interactions with models, and determining the appropriate response, typically by selecting a view to render. Understanding their role and how they work with routing and action methods is crucial for building robust web applications.