|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Table of Contents
Introduction and GoalIn this section, we will learn about the basics of MVC and then see how we can implement the same in ASP.NET using For the past few days, I have been writing and recording videos in design patterns, UML, FPA, Enterprise blocks and a lot more. You can watch the videos here. You can download my 400 .NET FAQ EBook from here. WarningMicrosoft has released the ASP.NET MVC Framework and the second tutorial will talk about that. In this tutorial, we will try to understand how we can implement MVC on pure ASP.NET. This will make our fundamentals more clear when we see the ready made framework of MVC ASP.NET. Pre-requisiteWe would suggest you to read the concept of The World is About Action, Format and DataWhen we talk about any project, it's all about action. Depending on action, the user sees some data in some kind of format. Let’s take up a small three liner customer project requirement shown below:
From the requirement, you can typically classify three entities: one is the action, second the view depending on the action and third the data to be displayed for the particular action and format. The above figure shows how the action, view and model / data will work together to fulfill our requirements. We have three actions from the above requirement:
Each of these actions is mapped to view / Web page which need to be displayed. For instance, when the user does the action The final table we conclude is as below:
The Problem of Tight Coupling and SolutionIf we closely visualize the above problem, we can figure the two big tight couplings: one is the action with the view and the view with the model, i.e. data. In practical scenarios, we can always think about many views which can tie up to the same models and many actions resulting the same view. So if decouple them we can avoid redundant coding and a better reusable framework. So what we do is we give this work of co-ordination to a third party i.e. the controller. Now all the actions are sent to the controller. The work of the controller is to update and load the model and then tie that model with the view depending on the action. Implementing MVC in ASP.NETWe will take the same example of the three liner customer project which we discussed previously. Below is a visual view of things and how it will move. If the action is The Easy Musketeer ModelLet’s first understand the model part of the MVC. This is the simplest part to start with and then we will proceed towards more complicated things like controller and views. Model is nothing but a class which will provide necessary data source to the views. The below code shows a customer data. It has three properties:
public class clsCustomer
{
private string _strCustomerName;
private string _strAddress;
private double _dblSales;
public string CustomerName
{
set
{
_strCustomerName = value;
}
get
{
return _strCustomerName;
}
}
public string Address
{
set
{
_strAddress = value;
}
get
{
return _strAddress;
}
}
public double Sales
{
set
{
_dblSales = value;
}
get
{
return _dblSales;
}
}
}
Correspondingly, I have made a collection where I will be loading some dummy records. In real projects, this class will connect to the database to load data. To keep the article simple, I have hardcoded data in the customer collection. public class clsCustomers : CollectionBase
{
public clsCustomers()
{
}
public void LoadCustomers()
{
Add("Shiv", "Mulund", 20);
Add("Raju", "Mumbai", 20);
Add("Manish", "Delhi", 20);
Add("Lalu", "Nepal", 20);
Add("Khadak", "Ratoli", 20);
Add("Shaam", "Ghatkopar", 20);
}
void Add(string strCustomerName, string strAddress, double dblSales)
{
clsCustomer objCustomer = new clsCustomer();
objCustomer.Address = strAddress;
objCustomer.CustomerName = strCustomerName;
objCustomer.Sales = dblSales;
List.Add(objCustomer);
}
}
The Second Musketeer: The ViewWe have three files in our view:
Home.aspx is pretty simple and only has the links. The DisplayCustomerWithOutSales.aspx will bind the customer’s data given by the controller. Controller will pass the data using the ASP.NET context. public partial class DisplayCustomerWithOutSales : System.Web.UI.Page
{
clsCustomers objCust;
protected void Page_Load(object sender, EventArgs e)
{
objCust = (clsCustomers) Context.Items["Customers"];
dtgWithOutSales.DataSource = objCust;
dtgWithOutSales.DataBind();
}
}
The DisplayCustomerWithSales.aspx also has the same code. You can see the same in the source code attached with this tutorial. The Third Tough Musketeer: ControllerWe would suggest you to read the concept of For every action, we have a controller class. In real projects, you can always map multiple actions to one controller class. To make the tutorial simple, I have kept one controller for every action. The controller will do three things:
Below is the home handler class. As it’s not tied up with any data, it does not call any model and just invokes the view. public class clsHomeHandler : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
context.Server.Transfer("./view/Home.aspx");
}
public bool IsReusable
{
get
{
return true;
}
}
}
Customer without sales controller class: This loads the model and adds the model data in the context. If you remember, in the view code snippet the data is taken from the context. After that, it just loads the view i.e. DisplayCustomerWithSales.aspx. public class clsHandlerCustomerWithSales : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
clsCustomers objCustomers = new clsCustomers();
objCustomers.LoadCustomers();
context.Items.Add("Customers", objCustomers);
context.Server.Transfer("./view/DisplayCustomerWithSales.aspx");
}
public bool IsReusable
{
get
{
return true;
}
}
}
The third controller is customer without sales. The code is self explanatory as it maps with the previous code snippet logic. public class clsHandlerCustomerWithOutSales : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
clsCustomers objCustomers = new clsCustomers();
objCustomers.LoadCustomers();
context.Items.Add("Customers", objCustomers);
context.Server.Transfer("./view/DisplayCustomerWithOutSales.aspx");
}
public bool IsReusable
{
get
{
return true;
}
}
}
The Web.Config File and the HttpHandler SectionIn Web.config file, we just map the action with the handlers. The actions are nothing put paths currently. <httpHandlers>
<add verb="*" path="GoToHome" type="Controller.clsHomeHandler, Controller"/>
<add verb="*" path="ViewCustomersWithOutSales"
type="Controller.clsHandlerCustomerWithOutSales, Controller"/>
<add verb="*" path="ViewCustomersWithSales"
type="Controller.clsHandlerCustomerWithSales, Controller"/>
</httpHandlers>
So
Action History
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||