Microsoft Aspnet MVC Core
Microsoft Aspnet MVC Core
Microsoft Aspnet MVC Core
1. What is MVC?
2. How MVC Design Pattern Works?
3. Where MVC Design Pattern is used in real-time there layer application?
4. What is ASP.NET Core MVC?
What is MVC?
The MVC stands for Model View and Controller. It is an architectural software design
pattern which is basically used to develop interactive applications. An interactive
application is an application where there is user interaction involved and based on the
user interaction some event handling occurred.
The most important point that you need to remember is, it is not only used for
developing web-based applications but also we can use this MVC design pattern to
develop the Desktop or mobile based application.
The MVC (Model-View-Controller) design pattern was introduced in the 1970s which
divides an application into 3 major components. They are Model, View, and Controller.
The main objective of the MVC design pattern is the separation of concerns. It means
the domain model and business logic are separated from the user interface (i.e.
view). As a result, maintaining and testing the application becomes simpler and easier.
Let us see an example to understand how the MVC pattern works in asp.net core MVC
application. For example, we want to design an application, where we need to display
the student details in a web page as shown below.
So, when we issue a request something like
“http://dotnettutorials.net/student/details/2” from a web browser then the following
things are happening in order to handle the request.
The controller is the component in MVC design pattern, who actually handle the
incoming request. In order to handle the request, the controller components do several
things are as follows.
The controller component creates the model that is required by a view. The model is the
component in MVC design pattern which basically contains classes which are used to
store the domain data or you can say business data.
In the MVC design pattern, the Model component also contains the required logic in
order to retrieve the data from a database. Once the model created by the controller,
then the controller selects a view to render the domain data or model data. While
selecting a view, it is also the responsibility of the controller to pass the model data.
In the MVC design pattern, the only responsibility of view is to render the model
data. So, in MVC, the view is the component whose responsibility is to generate the
necessary HTML in order to render the model data. Once the HTML is generated by the
view, then that HTML is then sent to the client over the network, who initially made the
request.
Let us discuss each of the components of the MVC design pattern in detail.
Model:
The Model is the component in MVC Design pattern which is used to manage that data
i.e. state of the application in memory. The Model represents a set of classes which is
used to describe the applications validation logic, business logic, and data access
logic. So in our example, the model consists of Student class and
the StudentBusinessLayer class.
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public string Branch { get; set; }
public string Section { get; set; }
}
Here, in our example, we use the Student class to hold the student data in memory. The
StudentBusinessLayer class is used to manage the student data i.e. going to perform
the CRUD operation.
So, in short, we can say that a Model in MVC design pattern contains a set of classes
which is used to represent the data and also contains the logic to manage those data. In
our example, the Student class is the class which is used to represent the data.
The StudentBusinessLayer class is the class which is used to manage the Student data.
View:
The view component in MVC Design pattern is used to contain the logic to represent the
model data as a user interface with which the end user can interact. Basically, the view
is used to render the domain data (i.e. business data) which is provided to it by the
controller.
For example, we want to display Student data in a web page. In the following example,
the Student model carried the student data to the view. As already discussed, the one
and only responsibility of the view is to render that student data. The following code
does the same thing.
@model ASPCoreApplication.Models.Student
<html>
<head>
<title>Student Details</title>
</head>
<body>
<br/>
<br/>
<table>
<tr>
<td>Student ID: </td>
<td>@Model.StudentID</td>
</tr>
<tr>
<td>Name: </td>
<td>@Model.Name</td>
</tr>
<tr>
<td>Gender: </td>
<td>@Model.Gender </td>
</tr>
<tr>
<td>Branch: </td>
<td>@Model.Branch</td>
</tr>
<tr>
<td>Section: </td>
<td>@Model.Section </td>
</tr>
</table>
</body>
</html>
Controller:
The Controller is the component in an MVC application which is used to handle the
incoming HTTP Request and based on the user action, the respective controller will
work with the model and view and then sends the response back to the user who
initially made the request. So, it is the one which will interact with both the models and
views to control the flow of application execution.
In our example, when the user issued a request the following URL
http://dotnettutorials.net/student/details/2
Then that request is mapped to the Details action method of the Student Controller.
How it will map to the Details action method of the Student Controller that will discuss in
our upcoming articles.
return View(studentDetail);
}
}
As you can see in the example, the Student Controller creates the Student object within
the Details action method. So, here the Student is the Model. To fetch the Student data
from the database, the controller uses the StudentBusinessLayer class.
Once the controller creates the Student model with the necessary student data, then it
passes that Student model to the Details view. The Details view then generates the
necessary HTML in order to present the Student data. Once the HTML is generated,
then this HTML is sent to the client over the network who initially made the request.
Note:
In MVC design pattern both the Controller and View depends on Model. But the Model
never depends on either view or controller. This is one of the main reasons for the
separation of concerns. This separation of concerns allows us to build the model and
test independently of the visual presentation.
1. Presentation Layer: This layer is responsible for interacting with the user.
2. Business Layer: This layer is responsible for implementing the core business
logic of the application.
3. Data Access Layer: This layer is responsible for interacting with the database to
perform the CRUD operations.
The MVC design pattern is basically used to implement the Presentation Layer of the
application. Please have a look at the following diagram.
The ASP.NET Core MVC is a lightweight, open source, highly testable presentation
framework which is used for building web apps and APIs using the Model-View-
Controller design pattern.
The ASP.NET Core MVC Framework provides us with a patterns-based way to develop
dynamic websites and web apps with a clean separation of concerns. This framework
provides us the full control over the mark-up. It also supports for Test Driven
Development and also uses the latest web standards.
In the next article, we are going to discuss how to set up the MVC middleware in
asp.net core application.
SUMMARY
In this article, I try to give a brief Introduction to ASP.NET Core MVC application. I hope
this article will help you with your need. I would like to have your feedback. Please post
your feedback, question, or comments about this article.
If we want then we can build an entire application using only the asp.net core
middlewares. But the ASP.NET Core MVC framework provides us the features that we
can use to create HTML pages and HTTP-based APIs easily.
To create a new ASP.NET Core application, Open Visual Studio. Then select File =>
New => Project option as shown in the below image.
Once you click on the Project option, then it will open the New Project dialog window. In
the “New Project” dialog, from the left pane expand “Installed” template section. Then
expand the “Visual C#” section and select “.NET Core“. From the middle pane
select ASP.NET Core Web Application. Provide the name as
“FirstCoreMVCApplication” and select the location where you want to store the
Project. Finally, click on the OK button as shown below.
Once you click on the OK button, it will open the following window where we need to
select the ASP.NET Core version and template types. So, select ASP.NET Core
2.2 which is the latest version as of this writing from the version selector drop-down list.
Select the template as Empty as we are going to do everything from scratch. Then
uncheck the Configure for HTTPS checkbox. Finally, click on the OK button as shown
in the below image.
That’s it. The project is created with the default template. The default template by
default does not include the setup for MVC. Now let us see how to setup MVC in
asp.net core application.
There are two simple steps required to setup MVC in ASP.NET Core Application.
Step1:
First, we need to add the required MVC services to the dependency injection
container. To do so you need to add the following code within the
ConfigureServices() method of the Startup class which is present within the
Startup.cs class file. This code will include all the required services which are required
to develop asp.net core MVC application.
Note: Along with AddMVC() method, we also have AddMvcCore() method. In the next
article we will discuss the AddMvcCore() method in details as well as we will also
discuss the difference between two methods and when to use one over another.
Step2:
In the second step, we need to add the required MVC middleware to the applications
request processing pipeline. Here also, the framework provides two middlewares i.e.
UseMvcWithDefaultRoute() and UseMvc(). In this article, we are going to use the
UseMvcWithDefaultRoute() middleware and in our upcoming articles, we will discuss
the use of UseMvc() middleware.
That’s it. We are done with the setup for MVC in asp.net core application. Now run the
application and navigate the root URL of your application. In my case, the root URL is
“http://localhost:52190/” and when you navigate to that URL, you will see the “Hello
World!” message in the browser.
As we have not specified the controller and action in the URL, so the MVC middleware
will look for the default index action method of the Home controller. As of now, we have
not created the Home Controller. So the MVC middleware will pass that request to the
next middleware which is registered using the Run() method and this is the middleware
which will serve the request and returns the “Hello World!” message which we saw in
the browser.
Now let us see, what happens if we remove the middleware which is registered using
the Run(). So modify the Configure method as shown below.
Now run the application and navigate to the root URL of your application and you see
the following page.
Now we see the HTTP Error 404. The reason for this is the
UseMvcWithDefaultRoute() middleware did not find the Home Controller with
the Index() action method and there is no other middleware in the request processing
pipeline as result we get 404 error.
In ASP.NET Core MVC application, all the Controllers should be present within a
specific folder called Controllers. So first we need to add the Controllers folder with the
root project folder. Once you add the Controllers folder then add a new class file with
the name HomeController within the Controllers folder.
Once you add the HomeController class, your project folder structure should be as
shown below.
Now open the HomeController class and then copy and paste the following code
in it.
Now run the application and navigate to the root URL of the application and you will see
the message as “This is Index action from MVC Controller” in the browser.
So in short, to Setup MVC in asp.net core application, first we need to add the required
MVC services to dependency injection container and secondly, we need to configure the
MVC middleware in the request processing pipeline.
In the next article, I am going to discuss the difference between AddMvc and
AddMvcCore and when to use one over another in ASP.NET Core MVC application.
SUMMARY
In this article, I try to explain how to Setup MVC in ASP.NET Core Application step by
step with an example. I hope this article will help you with your need. I would like to
have your feedback. Please post your feedback, question, or comments about this
article.
Along with AddMvc() method, we can also use the AddMvcCore() method to Setup the
MVC in ASP.NET Core application. So, in short, we can say that the
IServiceCollection interface provides two methods such as AddMvc() and
AddMvcCore() to setup MVC in an ASP.NET Core application.
We are going to work with the same example that we created in our previous article. In
our previous article, we use the AddMvc() method. Before going to understand the
difference between AddMvc() and AddMvcCore() method, let us first do some changes
into our HomeController.
As you can see in the above image, the HomeController class is not inherited from the
base Controller class. But still it works as expected and we get the output when we run
the application. This is because within the index action method we are simple returning
a string.
But this is not going to be worked if we want to return an HTML View or JSON Data
from the Index action method. If you want to return the JSON Data or HTML View from
an action method then the Controller class should inherit from the base Controller class
which is provided by the ASP.NET Core framework.
So let’s modify the HomeController class to return JsonResult from the Index action
method. First import the Microsoft.AspNetCore.Mvc namespace and then inherit the
HomeController class from the base Controller class as shown below.
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public JsonResult Index()
{
return Json(new { Name = "James", Department = "IT", Salary = 25000 });
}
}
}
Following is the code of our Startup class. As you can see, here we are using the
AddMvc() method to configure the MVC services to the dependency injection container.
Now run the application and navigate to the root URL of your application. You will see
the JSON data as expected in the browser.
Now let us modify the ConfigureServices() method of the Startup class as shown below
to use the AddMvcCore() method to register the MVC services to the dependency
injection container.
With the above changes in the ConfigureServices() method, now run the application and
navigate to the root URL of the application. You will get the following error.
The above error clearly states that there is no JSON Formatter registered with the
dependency injection container in order to return JSON data. We got this error when we
use the AddMvcCore() method but not with the AddMvc() method. The reason is the
AddMvc() method registered the Json Formatters within the dependency injection
container but not the AddMvcCore() method.
As asp.net core is open source, so you can the source code of the AddMvc() method by
navigating to the following github page.
https://github.com/aspnet/Mvc/blob/edb5baf81c07e3e9db8c3019439414094acb6ef8/src
/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
Please have a look at the source code of AddMvc() method.
Now let’s have a look at the AddMvcCore() method source code by visiting to the
following githuib page.
https://github.com/aspnet/Mvc/blob/1521f9298bc44e70d0fc5f9bc0814e101bbcc479/src/
Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreServiceCollectionExten
sions.cs
Please have a look at the source code of AddMvcCore() method.
So the difference is that, the AddMvcCore() method adds only the required MVC
services to the dependency injection container whereas the AddMvc() method adds all
the required MVC services. As you can see from the source code of the AddMvc()
method, it internally calls the AddMvcCore() method to add all the core services which is
required for MVC.
So let’s modify the ConfigureServices() method of the Startup class as shown below to
register the JsonFormatters with AddMvcCore() method to return Json data.
With the above changes, now run the application and you will see the output as
expected. In the next article, I am going to discuss working with Models in ASP.NET
Core MVC application.
SUMMARY
In this article, I try to explain the Difference Between AddMvc() and AddMvcCore()
method in ASP.NET Core application step by step with an example. I hope this article
will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
Model in ASP.NET Core MVC contains a set of classes which are used to represent the
domain data as well as it also contains logic to manage the domain data. So in the
simple word we can say that the model in MVC is used to manage the data i.e. the state
of the application in memory.
Note: It is not mandatory, but it is a good programming practice to store all model
classes within the Models folder.
Let us see how to create and work with models in ASP.NET Core MVC.
Now open the Student.cs class file and then copy and paste the following code.
using System;
namespace FirstCoreMVCApplication.Models
{
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public string Branch { get; set; }
public string Section { get; set; }
public string Gender { get; set; }
}
}
This is our student model which is going to store the student data in memory. As we
already discussed, the model in asp.net core MVC also contains business logic to
manage the data. So in our example, to manage the student data i.e. to perform the
CRUD operation on the student data we are going to use the following
IStudentRepository interface.
Right click on the Models folder and then add an interface with the name
IStudentRepository.cs. Once you create the interface then copy and paste the following
code in it.
namespace FirstCoreMVCApplication.Models
{
public interface IStudentRepository
{
Student GetStudentById(int StudentId);
}
}
As you can see, we created the above interface with one method i.e. GetStudentById()
method which will retrieve the student details by the student id.
Let us create an implementation class for the above IStudentRepository interface. In our
upcoming article, we will discuss how to retrieve the student details from a database.
But for this demo, lets hardcoded the student details. So, create a class file with the
name TestStudentRepository within the Models folder and then copy and paste the
following code in it.
using System.Collections.Generic;
using System.Linq;
namespace FirstCoreMVCApplication.Models
{
public class TestStudentRepository : IStudentRepository
{
private List<Student> _studentList;
public TestStudentRepository()
{
_studentList = new List<Student>()
{
new Student() { StudentId = 101, Name = "James", Branch = "CSE", Section = "A",
Gender = "Male" },
new Student() { StudentId = 102, Name = "Smith", Branch = "ETC", Section = "B",
Gender = "Male" },
new Student() { StudentId = 103, Name = "David", Branch = "CSE", Section = "A",
Gender = "Male" },
new Student() { StudentId = 104, Name = "Sara", Branch = "CSE", Section = "A",
Gender = "Female" },
new Student() { StudentId = 105, Name = "Pam", Branch = "ETC", Section = "B",
Gender = "Female" }
};
}
using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public JsonResult GetStudentDetails(int Id)
{
TestStudentRepository repository = new TestStudentRepository();
Student studentDetails = repository.GetStudentById(Id);
return Json(studentDetails);
}
}
}
Now run the application and you will see the student data in JSON format as expected
in the browser. The way we implemented the GetStudentDetails method of Home
Controller is not loosely coupled. That means tomorrow if the implementation class of
IStudentRepository is changed then we need to change the code in Home Controller
class as both are tightly coupled. We can overcome this problem by implementing
dependency injection design pattern.
In our next article, we are going to discuss how to implement the dependency
injection in ASP.NET core MVC application.
SUMMARY
In this article, I try to explain the Model in ASP.NET Core MVC application. I hope this
article will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
Student.cs: This is our model class which is going to store the student data.
IStudentRepository.cs: This is our student service interface. Here we need to declare
the methods. As of now, we have only one method which will retrieve the student details
based on student id.
Startup.cs:
This is the class file where we need to register the required MVC services to
dependency injection container and configuring the MVC middleware to the request
processing pipeline.
HomeController.cs:
As shown in the above example, in order to get student data, the HomeController class
depends on TestStudentRepository class. Here within the HomeController class, we
create an instance of TestStudentRepository class and then invoke
the GetStudentById() method. This is tight coupling because the HomeController
class is now tightly coupled with the TestStudentRepository class.
The Dependency Injection a process of injecting the object of a class into a class which
depends on it. The Dependency Injection is the most commonly used design pattern
nowadays to remove the dependencies between the objects. So, the Dependency
Injection design pattern allows us to develop loosely coupled software components.
using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
//Create a reference variable of IStudentRepository
private readonly IStudentRepository _repository = null;
Code Explanation:
We created the variable as read-only which will ensure that once we injected the
dependency object then that value can never be changed.
We get the above error because the ASP.NET dependency injection container does not
identify which class instance to provide if someone requests an object which
implements the IStudentRepository.
So, in order to overcome the above InvalidOperationException error, let’s register the
TestStudentRepository class with the ASP.NET Core dependency injection container.
Before we can discuss how to register a service with the Dependency Injection
Container, it is important to understand the lifetime of service. When a class receives
the dependency object through dependency injection, then whether the instance it
receives is unique to that instance of the class or not depends on the lifetime of the
service. Setting the lifetime of the dependency object determines how many times the
dependency object need to be created.
The ASP.NET core provides 3 methods to register a service with the ASP.NET Core
Dependency Injection container. The method that we use to register a service will
determine the lifetime of that service.
1. AddSingleton
2. AddScoped
3. AddTransient
AddSingleton():
When we use the AddSingleton() method to register a service, then it will create a
singleton service. It means a single instance of that service is created and that singleton
instance is shared among all the components of the application that require it. That
singleton service is created when we requested for the first time.
AddScoped():
Scoped means instance per request. When we use the AddScoped() method to register
a service, then it will create a Scoped service. It means, an instance of the service is
created once per each HTTP request and uses that instance in other calls of the same
request.
AddTransient():
When we use the AddTransient() method to register a service, then it will create a
Transient service. It means a new instance of the specified service is created each time
when it is requested and they are never shared.
Note: In the real-time applications, you need to register the components such as
application-wide configuration as Singleton. The Database access classes like Entity
Framework contexts are recommended to be registered as Scoped so that the
connection can be re-used. If you want to run anything in parallel then it is better to
register the component as Transient.
In this article, we are going to use the AddSingleton() method to register the
component. In our upcoming articles, we will discuss the rest two methods.
Here we need to call the AddSingleton() method on the services instance within the
ConfigureServices() method of the Startup class as shown below.
With the above changes, now run the application and navigate to
Home/GetStudentDetails/102 URL and you will see the output as expected.
What are the advantages of using Dependency Injection?
The ASP.NET Core Dependency Injection allows us to develop loosely coupled software
components. Using the ASP.NET Core Dependency Injection, it is very easy to swap
with a different implementation of a component.
In the next article, I am going to discuss the Controllers in ASP.NET Core MVC
application.
SUMMARY
In this article, I try to explain the ASP.NET Core Dependency Injection with an
example. I hope this article will help you with your need. I would like to have your
feedback. Please post your feedback, question, or comments about this article.
What is a Controller?
A controller in ASP.NET Core MVC application is a class having a set of public methods.
These public methods are called as actions (action methods). These action methods
are the methods of a Controller which is actually going to handle the incoming HTTP
Requests.
The Controllers in MVC application logically group similar type of actions together. This
aggregation of actions or grouping similar type of action together allows us to define
sets of rules such as caching, routing, and authorization which is going to be applied
collectively.
By convention, the controller classes in ASP.NET Core MVC application should reside in
the project’s root-level Controllers folder and inherits from the
Microsoft.AspNetCore.Mvc.Controller base class.
We can consider a class as a Controller when at least of the following conditions is true.
1. The class name is suffixed with the word “Controller” or if the class inherits from
a class whose name is suffixed with the word “Controller”
2. The class is decorated with the [Controller] attribute.
http://localhost:xxxx/home/GetStudentDetails/102
How the above mapping is done that we will discuss in our upcoming articles. For now,
just understand that the above mapping is done by the routing rules which are defined
for your application.
In ASP.NET Core MVC the action methods of a controller can return different types of
data such as JSON, View, String, Object, XML, etc.
Controller Action Method Returning JSON Data:
In the below example, the GetStudentDetails action method always going to returns the
data in JSON format irrespective of the content negotiation. This is because of the
return type of the GetStudentDetails() method which is set to JsonResult. In this case
it is going to ignore the Accept Header values.
In the following example it looks for the Accept Header value and if the value is set
to application/xml, then it returns the data in XML format whereas if the value is set
to application/json, then the data is going to return in JSON format.
Note: In order to return XML data from an action method, you need to register the Xml
Serializer Formatter by calling the AddXmlSerializerFormatters() method within
the ConfigureServices() method of the Startup.cs class as shown in the below image.
In order to return a view from an action method in ASP.NET Core MVC, you need to use
ViewResult as the return type of the action method. In the following example, the
GetStudentDetails action method is going to return a View as the return of the method is
set to ViewResult.
In this article, I try to explain Controllers in ASP.NET Core MVC application. I hope this
article will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
In the Model-View-Controller (MVC) pattern, the View is the component which contains
logic to represent the model data (the model data provided to it by a controller) as a
user interface with which the end user can interact. The Views in MVC are HTML
templates with embedded Razor mark-up which generate content that sends to the
client. In our upcoming articles, we will discuss the Razor syntax in detail.
In ASP.NET Core MVC, views are having “.cshtml” extension if the programming
language is C# with Razor mark-up. Usually, each controller will have its own folder in
which the controller-specific view files are going to be stored. The controller-specific
folders are going to be created within the Views folder. The point that you need to
remember is the view file name is the same as the action method name of a controller
with .cshtml extension.
Example:
Let’s say, we have an ASP.NET Core MVC application with two controllers i.e.
HomeController and StudentController. The HomeController is created with the
following three action methods.
1. AboutUs()
2. ContactUs()
3. Index()
On the other hand, the StudentController is created with the following four action
methods.
1. Index()
2. Details()
3. Edit()
4. Delete()
As you can see a separate folder is created for each controller within the Views Folder.
The Home Controller is represented by a Home folder and the Student Controller is
represented by a Student folder inside the Views folder. The Home folder contains the
views for the Index, AboutUs and ContactUs webpages. So whenever a user request for
any of these webpages then the Home Controller action method determine which of the
above three views to use to build the webpage and return to the user.
Similarly, the Student folder contains the views for the Index, Details, Edit and Delete
webpages. So whenever a user request for any of these webpages then the Student
Controller action method determine which of the above views to use in order to build the
webpage and return to the user.
In addition to action-specific views, we also have provided with partial views, layouts,
and view components that can also be used to reduce the repetition and allow for reuse
within the application’s views.
To understand the views, let first modify the HomeController as shown below.
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public ViewResult Details()
{
return View();
}
}
}
As you can see in the above HomeController, we have only one action method i.e.
Details. As the return type of the Details() action method is ViewResult, so this action
method is going to return a view. In order to return a view, here we are using the View()
extension method which is provided by Microsoft.AspNetCore.Mvc.Controller Base
class.
Now run the application and navigate to the “/Home/Details” URL and you will see the
following error.
First, it will look for the “Details.cshtml” file within the “/Views/Home” folder as the
action method belongs to Home Controller.
Finally, it will try to find out the “Details.cshtml” file in “/Pages/Shared/” folder.
If the requested “.cshtml” file found in any of the above folders, then the View
generates the HTML and send the generated HTML back to the user who initially made
the request. On the other hand, if the requested file is not found in any of the above
locations, then we will get the error.
Creating View:
First, create the Views folder at the root level of the application. Once you create the
Views Folder, then create a Home folder within that Views folder.
Now Right click on the Home folder and select Add => New Item from the context
menu which will open the following Add New Item window. From this window, select
Razor View, provide the name as Details.cshtml and finally click on the Add button as
shown below.
Once you created the Details,cshtml view, then the Views folder structure should look
like below.
Now open the Details.cshtml file and then copy and paste the following code in it.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<h1>Details view belongs to Views/Home folder</h1>
</body>
</html>
That’s it. Run the application and navigates to the “/Home/Details” URL and you will
see the output as expected in the browser. If you go to the definition of Controller base
class, then you will find there four overload versions of the View method as shown in the
below image.
Let us discuss the use and significance of each of the above-overloaded versions of the
View Extension method.
If you are using the View() or View(object model) extension method to return a view,
then it will look for the view file with the same name as the action method name.
For example, in the below code we are using the View() extension method which does
not take any parameter to return a view from the Details action method of Home
Controller. So in this case, by default, the MVC framework will look for a view with the
name Details.cshtml within the “Views/Home” folder.
This overloaded method takes the name or path of the view as an input parameter and
then return that view as a response. To understand this let’s create a view with the
name Test.cshtml within the Home folder.
Right click on the Home folder and then select add => new item which will open add
new item window. From that window select the Razor view and provide the name as
Test.cshtml and click on the Add button which will add the Test.cshtml view within the
Home folder. Open the Test.cshtml view file and then copy and paste the below code.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<h1>Test view coming from Views/Home Folder</h1>
</body>
</html>
Now modify the Details action method of Home controller as shown below to use the
View extension method which takes the view name as a parameter.
Now run the application and navigate to the “/Home/Details” URL and you will see that
the response is coming from the Test view.
Note: You need to specify the view name without extension. Using this overloaded
version, it is also possible to specify the file path. You can specify either the absolute
path or relative path.
Let us modify the Details action method of the Home controller as shown below to
specify the Absolute path of the view file. So here, the ASP.NET Core MVC framework
will look for a view file with name “Test.cshtml” within the “Views/Home” folder.
Note: When you are using the absolute path, then it is mandatory to use
the .cshtml extension.
When you are using an absolute path, in order to get to the project’s root directory, you
can use / or ~/. So you can use any one of the following and all are going to do the
same thing.
The Views in MVC application provides the separation of concerns (codes). It separates
the user interface from the business logic or you can say from the rest of the
application. The ASP.NET Core MVC views use the Razor syntax which makes it easy
to switch between the HTML markup and C# code. The Common or repetitive aspects
of the applications user interface can be easily reused between views using layout and
shared directives or partial views.
In the next article, I am going to discuss how to pass data to views in ASP.NET Core
MVC application with examples.
SUMMARY
In this article, I try to explain Views in ASP.NET Core MVC application. I hope this
article will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
The ViewData in MVC is a dictionary of weakly typed objects which is derived from the
ViewDataDictionary class.
As the ViewData is a dictionary object, so it will store the data in the form of key-value
pairs where each key must be a string. You can access the string data from the
ViewData dictionary without casting the data to string type. But if you are accessing
data other than the string type then you need to explicitly cast the data to the type you
are expecting.
Let us see an example to understand how to use view data to pass data from a
controller action method to a view.
In our example, we want to pass three pieces of information to the view from the
controller. One is the Title of the page, second is the Header of the Page and the third
one is the Student data that we want to show in the page.
So modify the Details action method of the Home Controller as shown below.
using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public ViewResult Details()
{
//String string Data
ViewData["Title"] = "Student Details Page";
ViewData["Header"] = "Student Details";
Student student = new Student()
{
StudentId = 101,
Name = "James",
Branch = "CSE",
Section = "A",
Gender = "Male"
};
return View();
}
}
}
In order to access the ViewData, modify the Details.cshtml view file as shown below.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>@ViewData["Title"]</title>
</head>
<body>
<h1>@ViewData["Header"]</h1>
@{
var student = ViewData["Student"]
as FirstCoreMVCApplication.Models.Student;
}
<div>
StudentId : @student.StudentId
</div>
<div>
Name : @student.Name
</div>
<div>
Branch : @student.Branch
</div>
<div>
Section : @student.Section
</div>
<div>
Gender : @student.Gender
</div>
</body>
</html>
Now run the application and navigate to the “/Home/Details” URL and you will see the
data as expected as shown below.
The ViewData is dynamically resolved at runtime, as a result, it does not provide
compiles time error checking as well as we do not get any intelligence. For example, if
we miss-spell the key names then we wouldn’t get any compile time error. We get to
know about the error only at runtime
The ViewData only transfers the data from the controller action method to a view, but
not vice-versa. That means it is valid only during the current request.
In the next article, I will discuss ViewBag in ASP.NET Core MVC with an example.
SUMMARY
In this article, I try to explain ViewData in ASP.NET Core MVC application. I hope this
article will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
As we already discussed in ASP.NET Core MVC application, we can pass the data from
a controller to a view using ViewData, ViewBag, TempData and strongly typed view
model. In this demo, I am going to demonstrate to you how to use ViewBag to pass the
data from a controller action method to a view.
The ViewBag in ASP.NET Core MVC is one of the mechanisms to pass the data from a
controller action method to a view. If you go the Controller base class, then you will find
the following signature of the ViewBag property.
So the ViewBag is a dynamic property of the Controller base class. The dynamic type is
introduced in C# 4.0. It is very much similar to the var keyword that means we can store
any type of value in it but the type will be decided at run time rather than compile-time.
The ViewBag transfers the data from the controller action method to a view only, the
reverse is not possible.
How to Pass and Retrieve data From ViewBag in ASP.NET Core MVC:
The point that you need to keep in mind is, ViewBag is operating on the dynamic data
type. So we don’t require typecasting while accessing the data from a ViewBag. It does
not matter whether the data that we are accessing is of type string or any complex type.
Let us see an example to understand how to use ViewBag to pass data from a
controller to a view. We are going to work with the same example that we worked in our
previous article with ViewData.
using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public ViewResult Details()
{
ViewBag.Title = "Student Details Page";
ViewBag.Header = "Student Details";
Student student = new Student()
{
StudentId = 101,
Name = "James",
Branch = "CSE",
Section = "A",
Gender = "Male"
};
ViewBag.Student = student;
return View();
}
}
}
As you can see in the above example, here we are using the dynamic properties Title,
Header, and Student on the ViewBag.
Now we will see how to access the ViewBag data within an ASP.NET Core MVC view.
So modify the Details.cshtml view file as shown below.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<h1>@ViewBag.Header</h1>
@{
var student = ViewBag.Student;
}
<div>
StudentId : @student.StudentId
</div>
<div>
Name : @student.Name
</div>
<div>
Branch : @student.Branch
</div>
<div>
Section : @student.Section
</div>
<div>
Gender : @student.Gender
</div>
</body>
</html>
As you can see, here we are accessing the data from the ViewBag using the same
dynamic properties Title, Header, and Student. Now run the application and navigate to
the “/Home/Details” URL and you will see the data as expected in the webpage as
shown in the below image.
The ViewBag is a dynamic property which is resolved at runtime; as a result, here also it
will not provide compile-time error checking as well as intelligence support. For
example, if we miss-spell the property names of the ViewBag, then we wouldn’t get any
compile-time error rather we came to know about the error at runtime.
1. In ASP.NET Core MVC, we can use both ViewData and ViewBag to pass the
data from a Controller action method to a View.
2. The ViewData is a weakly typed dictionary object whereas the ViewBag is a
dynamic property. Both ViewData and ViewBag are used to create a loosely
typed view in MVC.
3. In ViewData, we use string keys to store and retrieve the data from the ViewData
dictionary whereas in ViewBag we use the dynamic properties to store and
retrieve data.
4. Both the ViewData keys and ViewBag dynamic properties are resolved only at
runtime. As a result, both do not provide compile-time error checking and
because of this, we will not get intelligence support.
5. So if we misspell the key names or dynamic property names then we will not get
any compile-time error rather we came to know about the error only at run time.
This is the reason why we rarely used ViewBag and ViewData in our application.
The best and preferred approach in MVC to pass data from a controller action method
to a view is by using a strongly typed model object. When we use a strongly typed
model object then only our view becomes a strongly typed view.
In the next article, I am going to discuss the strongly typed Views in ASP.NET Core
MVC application with an example.
SUMMARY
In this article, I try to explain ViewBag in ASP.NET Core MVC application. I hope this
article will help you with your need. I would like to have your feedback. Please post your
feedback, question, or comments about this article.
As we already discussed we can pass the model data to a view using many different
ways such as ViewBag, ViewData, strongly typed model object, etc. When we passed
the model data to a View using ViewBag or ViewData, then the view becomes a loosely
typed view. Here in this article, we will discuss how to pass a strongly typed model
object to a view to make the view strongly typed in ASP.NET Core MVC application.
In order to create a strongly typed view, from the action method of the controller, we
need to pass the model object as a parameter to the View() extension method. The
Controller base class provide us the following two overloaded versions of View()
extension method which we can use to pass the model object from the controller action
method to a view.
Here we are going to use the overloaded version which takes only the model object as
an input parameter. So modify the Details action method as shown below to pass the
student object as a parameter to the View extension method.
using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class HomeController : Controller
{
public ViewResult Details()
{
ViewBag.Title = "Student Details Page";
ViewBag.Header = "Student Details";
Student student = new Student()
{
StudentId = 101,
Name = "James",
Branch = "CSE",
Section = "A",
Gender = "Male"
};
return View(student);
}
}
}
In order to create a strongly typed view in ASP.NET Core MVC, we need to specify the
model type within the view by using the @model directive. As here, the Student class is
going to be our model so we need to specify the model as shown below.
@model FirstCoreMVCApplication.Models.Student
The above statement will tell the view that we are going to use
FirstCoreMVCApplication.Models.Student as the model for this view. The point that
you need to remember is, here in the directive (@model), m is in lowercase and the
statement should not be terminated with a semicolon.
Then in order to access the model object properties, you can simply use @Model, here
the letter M is in uppercase. So, in our example, we can access the Student object
properties such as Name, Gender, Branch, and Section by
using @Model.Name, @Model.Gender, @Model.Branch, and @Model.Section
respectively.
So Modify the Details.cshtml view file as shown below to make the view as
strongly typed.
@model FirstCoreMVCApplication.Models.Student
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<h1>@ViewBag.Header</h1>
<div>
StudentId : @Model.StudentId
</div>
<div>
Name : @Model.Name
</div>
<div>
Branch : @Model.Branch
</div>
<div>
Section : @Model.Section
</div>
<div>
Gender : @Model.Gender
</div>
</body>
</html>
Now run the application and navigate to the “/Home/Details” URL and you will see the
data as expected in the webpage.
We will get the following advantages when we use strongly typed view in ASP.NET
Core MVC application.
1. It will provide compile-time error checking, as a result, we will get the intelligence
support.
2. With intelligence support, the chances of mis-spelling the properties and making
typographical errors are almost zero.
3. If we misspell the property name, then it comes to know at compile time rather
than at runtime.
The best and preferred approach in ASP.NET Core MVC to pass data from a controller
action method to a view is by using a strongly typed model object.
In our example, we are still using ViewBag to pass the Header and Title from
the Controller action method to the View. Then definitely the question that comes to your
mind is how we will pass the Header and Title to a strongly typed view. Well, in such
scenarios we need to use a view specific model which is called View Model.
In our next article, I am going to discuss the View Model in ASP.NET Core MVC
application with an example.
SUMMARY
In this article, I try to explain Strongly Typed View in ASP.NET Core MVC application. I
hope this article will help you with your need. I would like to have your feedback. Please
post your feedback, question, or comments about this article.
In real-time applications, a single model object may not contain all the data required for
a view. In such situations, we need to use ViewModel in ASP.NET Core MVC
application. So in simple words, we can say that a ViewModel in ASP.NET Core MVC is
a model which contains more than one model data required for a particular view.
Combining multiple model objects into a single view model object provides us better
optimization.
The Following diagram shows the visual representation of a view model in ASP.NET
Core MVC application.
Let say we want to display the student details in a view. We have two different models to
represent the student data. The Student Model is used to represent the student basic
details where the Address model is used to represent the address of the student. Along
with the above two models, we also required some static information like page header
and page title in the view. If this is our requirement then we need to create a view model
let say StudentDetailsViewModel and that view model will contain both the models
(Student and Address) as well as properties to store the page title and page header.
First, create a class file with the name Student.cs within the Models folder of your
application. This is the model which is going to represent the basic information of a
student such as name, branch, section, etc. Once you create the Student.cs class
file, then copy and paste the following code in it.
namespace FirstCoreMVCApplication.Models
{
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public string Branch { get; set; }
public string Section { get; set; }
public string Gender { get; set; }
}
}
Next, we need to create the Address model which is going to represent the Student
Address such as City, State, Country, etc. So, create a class file with the name
Address.cs within the Models folder and then copy and paste the following code in it.
namespace FirstCoreMVCApplication.Models
{
public class Address
{
public int StudentId { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string Pin { get; set; }
}
}
Now we need to create the View Model which will store the required data that is
required for a particular view. In our case its student’s Details view. This View Model is
going to represent the Student Model + Student Address Model + Some additional data
like page title and page header.
You can create the View Models anywhere in your application, but it is recommended to
create all the View Models within a folder called ViewModels to keep the things
organized.
So first create a Folder at the root directory of your application with the name
ViewModels and then create a class file with the name StudentDetailsViewModel.cs
within the ViewModels folder. Once you create the StudentDetailsViewModel.cs class
file, then copy and paste the following code in it.
using FirstCoreMVCApplication.Models;
namespace FirstCoreMVCApplication.ViewModels
{
public class StudentDetailsViewModel
{
public Student Student { get; set; }
public Address Address { get; set; }
public string Title { get; set; }
public string Header { get; set; }
}
}
Right click on the Controllers folder and then add a new class file with the name
StudentController.cs and then copy and paste the following code in it.
using FirstCoreMVCApplication.Models;
using FirstCoreMVCApplication.ViewModels;
using Microsoft.AspNetCore.Mvc;
namespace FirstCoreMVCApplication.Controllers
{
public class StudentController : Controller
{
public ViewResult Details()
{
ViewBag.Title = "Student Details Page";
ViewBag.Header = "Student Details";
//Student Address
Address address = new Address()
{
StudentId = 101,
City = "Mumbai",
State = "Maharashtra",
Country = "India",
Pin = "400097"
};
As you can see, now we are passing the view model as a parameter to the view. This is
the view model which contains all the data required by Details view. As you can notice,
now we are not using any ViewData or ViewBag to pass the Page Title and Header to
the view instead they are also part of the ViewModel which makes it a strongly typed
view.
@model FirstCoreMVCApplication.ViewModels.StudentDetailsViewModel
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>@Model.Title</title>
</head>
<body>
<h1>@Model.Header</h1>
<div>
StudentId : @Model.Student.StudentId
</div>
<div>
Name : @Model.Student.Name
</div>
<div>
Branch : @Model.Student.Branch
</div>
<div>
Section : @Model.Student.Section
</div>
<div>
Gender : @Model.Student.Gender
</div>
<h1>Student Address</h1>
<div>
City : @Model.Address.City
</div>
<div>
State : @Model.Address.State
</div>
<div>
Country : @Model.Address.Country
</div>
<div>
Pin : @Model.Address.Pin
</div>
</body>
</html>
Now, the Details view has access to the StudentDetailsViewModel object that we
passed from the controller action method using the View() extension method. By using
the @model directive, we set StudentDetailsViewModel as the Model for the Details
view. Then we access Student, Address, Title, and Header using @Model property.
Now run the application, and navigate to the “/Student/Details” URL and you will see
the output as expected in the webpage as shown in the below image.
In the next article, I am going to discuss implementing the List view in ASP.NET MVC
application with an example.
SUMMARY
In this article, I try to explain the ViewModel in ASP.NET Core MVC application. I hope
this article will help you with your need. I would like to have your feedback. Please post
your feedback, question, or comments about this article.
So, the ASP.NET Core Framework maps the incoming Requests i.e. URLs to the
Controllers action methods based on the routes configured in your application. You can
configure multiple routes for your application and for each route you can also set some
specific configurations such as default values, constraints, message handlers, etc. If this
is not clear at the moments then don’t worry we will discuss each and everything with
examples.
What are the different Types of Routing Provided by ASP.NET Core MVC?
In ASP.NET Core MVC application, you can define routes in two ways. They are as
follows:
Attribute-Based Routing:
In Attribute Based Routing, the route is determined based on the attributes which are
configured either at the controller level or at the action method level.
Note: We can use both Conventional Based Routing and Attribute Based Routing in a
single application.
In this article, we are going to discuss the Conventional Based Routing and in the
article, we will discuss the Attribute Based Routing.
In ASP.NET Core MVC application, it is the controller action method which is going to
handle the incoming Requests i.e. URLs. For example, if we issue a request to the
“/Home/Index” URL, then it is the Index action method of Home Controller class which
is going to handle the request as shown in the below image.
Similarly, if you issue a request to the “/Home/Details/2” URL, then it is the Details
action method of the Home Controller class which is going to process that request as
shown in the below image. Here the parameter value 2 is automatically mapped to the
id parameter of the Details action method.
Now, the question that should come to your mind is, we have to explicitly define any
routing rules for the application, then how does this mapping done i.e. how the
“/Home/Index” URL is mapped to the Index action method and how “/Home/Details/2”
URL is mapped to the Details action method of the Home Controller class.
This is actually done by the MVC Middleware which we registered in the application’s
request processing pipeline.
As we already discussed in our previous article that we can add the required MVC
middleware into the request processing pipeline either by calling the
UseMvcWithDefaultRoute() method or by calling the UseMvc() method within in the
Configure() method of the Startup.cs class file as shown in the below image. As of now,
we are using the UseMvcWithDefaultRoute() middleware.
Let have a look at the implementation of the UseMvcWithDefaultRoute() method by
visiting the following GitHub URL.
https://github.com/aspnet/Mvc/blob/release/2.2/src/Microsoft.AspNetCore.Mvc.Core/Buil
der/MvcApplicationBuilderExtensions.cs
As you can see in the above implementation, this method internally calls the UseMvc()
method which will add the default route into the application’s request processing
pipeline. The default route is created with the following URL template:
{controller=Home}/{action=Index}/{id?}
The above default route template maps most URL’s that have the following pattern.
http://localhost:52190/Student/Details/2
The first segment path of the URL i.e. “/Student” is mapped to the “StudentController“.
As you can see in the URL we do not have the word Controller with the first segment
path of the URL. But it maps to the StudentController, this is because when ASP.NET
Core MVC Framework finds the word /Student as the first segment path of URL, then it
internally appends the word Controller.
The second segment path of the URL i.e. “/Details” is mapped to the “Details(int id)”
action method of the HomeController class and the third segment path of the URL i.e.
“2” is mapped to the “id” parameter of the Details(int id) action method.
/Home/Details/1
/Home/Details
That means if we navigate to the applications root URL then as shown, then that
request is going to be handled by the Index action method of the Home Controller class.
http://localhost:52190
The following two URLs are also mapped to the Index action method of the
HomeController class.
http://localhost:52190/Home
http://localhost:52190/Home/Index
For most of the ASP.NET Core MVC applications, the default route works fine. For
example, let say we have the following student controller.
The URL “/student/index” is mapped to the Index() action method of
the StudentController class and the URL “/student/details” is mapped to the Details()
action method of the StudentController.
In the next article, I am going to discuss how to create Custom Routes, then we will also
discuss Route Constraints, Optional Parameters, Default values, Named route and how
to define multiple routes in ASP.NET Core MVC application.
SUMMARY
In this article, I try to explain what Routing in ASP.NET Core MVC application is and
How Routing works in ASP.NET Core MVC application. Then we also discussed how to
create custom routes. I hope it will give you a basic understanding of the above
concepts.