Before creating the Controller, we need to remove the following app.Run
statement as this will return Hello World!
for all the incoming requests. As we want incoming requests to be handled by the controllers, we need to remove the following code from the Configure
method of the Startup
class:
app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); });
We have installed the ASP.NET Core in our application. So, we are geared up to creating our first ASP.NET Core controller. Create a folder with the name Controllers
and add a new Controller by selecting from the context menu as shown in the following screenshot:
Once you select Add | New Item, you will be shown the following list of options. We are going to add an MVC controller class to our project:
A class will be created with the following content:
public class HomeController : Controller { // GET: /<controller>/ public IActionResult Index() { return View(); } }
All controllers, both MVC and Web API controllers, inherit from the Controller
base class. In earlier versions of ASP.NET MVC, MVC controllers would inherit from the Controller
class and Web API controllers would inherit from the APIController
class.
In the preceding HomeController
class, we have a single action method by Index
that returns the corresponding View. When you run the application as it is, you'll get a 500 Internal Server Error. The reason being is that no View has been created for the Index
action of the HomeController
and ASP.NET Core tries to search for that View. As the View is not available, it returns a 500 Internal Server Error.
Instead of creating and returning that View, let us make a simple change to this action method. Let us return a string, Hello World! I am learning MVC 6!
, and change the return type of IActionResult
:
public string Index() { return "Hello World! I am learning MVC 6!"; }
Run the application. You'll see the Hello World! I am learning MVC 6! in your browser as shown in the following screenshot. Please make sure that you remove the app.Run
statement in the Configure
method as mentioned earlier:
Voila! We have changed the ASP.NET Core application to render the custom content instead of the boring Hello World. What we have done may seem like a marginal improvement, but we have used controllers and action methods in our ASP.NET Core application, which has brought a lot of structure and flexibility to the web application development.
The following is the sequence of steps that occur when we run the application:
http://localhost:50140
, where 50140
is the port number selected by IIS Express to run the application on my local system. This number may vary.Controller
and action
method will be selected. In our case, HomeController
will be chosen as the Controller
and Index
will be chosen as the action
method in the HomeController
. Since ID
is the optional value and it is not passed, this ID
parameter is ignored.Controller
and action
methods are selected by the routing engine, control is passed to the action
method of the selected controller. In our case, it will be the Index
action method of the HomeController
.Index
action method, we are returning a string, Hello World! I am learning ASP.Net MVC 6!
. This text is returned from the controller, which would then return back to the user.If you noticed, the default return type in the action
method of the controller was IActionResult
and then we changed the return type to the string in order to return the text Hello World...
.
The IActionResult
is the interface that we can use to return different types of ActionResult
, ranging from a simple string to complex JSON data, so, we don't need to change the return
type of the action
method to return the string.
In the earlier example, I have changed the return
type to the string to make things simple. Now, let us make a simple change to return the string by keeping the return type (IActionResult
) as it is:
// GET: /<controller>/ public IActionResult Index() { return Content("Hello World! I am learning MVC 6!"); }
While returning the string, we are using the virtual
method, called Content
from the Controller
class (the base controller from where HomeController
is inherited from) in the preceding action
method. The purpose of this Content()
method is to convert the string to the type IActionResult
.
Now, run the application. We should be getting the same result.
IActionResult
is capable of returning different data types:
ContentResult
: Can return a text result.EmptyResult
: Returns a null
result.FileResult
: Returns a binary output to write to the response.HttpStatusCodeResult
: Provides a way to return.JavaScriptResult
: Returns a script that can be executed from the client side.JSonResult
: When you return a serialized JSON object.RedirectResult
: Redirects to another action
method.RedirectToRouteResult
: Represents a result that performs a redirection by using a specified route values dictionary.