Creating a complete ASP.Net MVC 4.0 application with Visual Studio 2012, C# , EF 5.0 (Code First) - part 2

I have decided to write a series of posts on how to write a small ASP.Net MVC 4.0 application.I will develop this application step by step and I will explain everything that you need to know in order to develop ASP.Net MVC 4.0 applications. This is the second post in this series. You can find the first one here. Make sure you read and understand the first post.

In this post I would like to look into the internals of ASP.Net MVC and what happens when an incoming HTTP request comes in from the browser. Bear in mind that the local web server is IIS Express .This is the web server that will handle the incoming request.IIS Express will take that request and deliver it to my application.Let's run our application again and click on the Contact link on the top right hand corner of the page. When I click that link the URL in my browser becomes http://localhost:59871/Home/Contact. As mentioned earlier the local web server will take this request and deliver it to my ASP.Net MVC application.Inside the ASP.Net MVC application there is a Routing Engine that takes requests and delivers them to the proper component. In this case the request will end up in the HomeController.cs class file. Remember that the Controller is the component in the MVC pattern that orchestrates everything.

A request for /Home/Something will always come to the HomeController.cs class.A request (in our case) http://localhost:59871/Home/Contact, will end up in the Contact method inside the HomeController.cs class file.


Have a look at the picture below

 

I am sure you can see the naming conventions applied here.This action method  public ActionResult Contact() does not do anything else but to return a View.No Model is build on this occasion.So how can we reach the appropriate view to display? There are more naming conventions.  Τhe ASP.Net MVC application will look in the Views Folder and then in the Home folder.The name Home matches the name of the Home controller and then it will pick the Contact.cshtml.Inside this view there is all the markup that is rendered by the browser.

Have a look at the picture below

 

I would like to explain a bit more the ViewBag property.

The ViewBag allows data to be added to it which is then available in the View.It is similar to how a session variable works, when you assign a value to a ViewBag property, such as ViewBag.

Have a look at the HomeController.cs file and the Contact method. It passes the ViewBag.Message = "Your contact page."; to the Contact View.

Open the Contact.cshtml file in the Solution Explorer

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>@ViewBag.Message</h2>
</hgroup>

As you can see in the bold line above, this is the way we get the contents of the ViewBag.Message  in the our view.

Let's add another ViewBag property

 Have a look at the code below

 

      public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
            ViewBag.AdminEmail = "admin@example.com";

            return View();
        }

I have added ViewBag.AdminEmail to the Contact method. Now I am going to retrieve the value inside the ViewBag.AdminEmail from the Contact.cshtml view.

        <p>
            <span class="label">WebMaster:</span>
            <span><a href="mailto:@ViewBag.AdminEmail">@ViewBag.AdminEmail</a></span>
        </p>

Obviously this is not the best way to pass data from our controller to the View. Let's add a model to our application. In the Models folder add a new class file and name it ContactModel.cs

The contents of this class follow

 

namespace MovieReviews.Models
{
    public class ContactModel
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public string Email { get; set; }
    }
}

I add three properties in my class. Now I need to change the code inside the Contact method in the HomeController.cs class

This is how Contact method looks now.

public ActionResult Contact()
        {
            //ViewBag.Message = "Your contact page.";
            //ViewBag.AdminEmail = "admin@example.com";

            var contact = new ContactModel();

            contact.Name = "Nick";
            contact.Surname = "kantzelis";
            contact.Email = "nikolaosk@admin.com";



     
       return View(contact);
        }

With this line of code  return View(contact); ,we say that we want to pass this model-contact to the appropriate View.

We need to modify the Contact.cshtml view

     <p>
            <span class="label">Name:@Model.Name</span><br />
            <span class="label">Surname:@Model.Surname</span><br />
            <span class="label">Email:@Model.Email</span>

    </p>

We use the @Model property (represents the model object - ContactModel object passed to the view ). This is a strongly typed property as opposed to the ViewBag.

In the beginning of the Contact.cshtml we must add this line of code.

@model MovieReviews.Models.ContactModel

By this line of code I inform the View about the model and what kind of model (ContactModel object) it has.

The razor engine now knows how to display this information to the user. We just have to place the @Model property in the appropriate place in the View.

Now when I run the application I see the following results.

 

Hope all makes sense now.I mean how the MVC pattern works and what the Controller, Model and the View do.

I know that we have not build the actual application yet. We will do that step by step in the next posts but it is of vital significance to understand the basic components of the MVC pattern and its internals.

Hope it helps!!

No Comments