Category Archives: ASP.NET MVC
ASP.NET MVC part 4 Adding a Model
Adding a Model
In this section you’ll add some classes for managing movies in a database. These classes will be the “model” part of the ASP.NET MVC application.
You’ll use a .NET Framework data-access technology known as the Entity Framework to define and work with these model classes. The Entity Framework (often referred to as EF) supports a development paradigm calledCode First. Code First allows you to create model objects by writing simple classes. (These are also known as POCO classes, from “plain-old CLR objects.”) You can then have the database created on the fly from your classes, which enables a very clean and rapid development workflow.
Adding Model Classes
In Solution Explorer, right click the Models folder, select Add, and then select Class.
Name the class “Movie”.
Add the following five properties to the Movie
class:
public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } }
We’ll use the Movie
class to represent movies in a database. Each instance of a Movie
object will correspond to a row within a database table, and each property of the Movie
class will map to a column in the table.
In the same file, add the following MovieDBContext
class:
public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } }
The MovieDBContext
class represents the Entity Framework movie database context, which handles fetching, storing, and updating Movie
class instances in a database. The MovieDBContext
derives from the DbContext
base class provided by the Entity Framework. For more information about DbContext
and DbSet
, seeProductivity Improvements for the Entity Framework.
In order to be able to reference DbContext
and DbSet
, you need to add the following using
statement at the top of the file:
using System.Data.Entity;
The complete Movie.cs file is shown below.
using System; using System.Data.Entity; namespace MvcMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } } public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } } }
Creating a Connection String and Working with SQL Server Compact
The MovieDBContext
class you created handles the task of connecting to the database and mapping Movie
objects to database records. One question you might ask, though, is how to specify which database it will connect to. You’ll do that by adding connection information in the Web.config file of the application.
Open the application root Web.config file. (Not the Web.config file in the Views folder.) The image below show both Web.config files; open the Web.config file circled in red.
Add the following connection string to the <connectionStrings>
element in the Web.config file.
<add name="MovieDBContext" connectionString="Data Source=|DataDirectory|Movies.sdf" providerName="System.Data.SqlServerCe.4.0"/>
The following example shows a portion of the Web.config file with the new connection string added:
<configuration> <connectionStrings> <add name="MovieDBContext" connectionString="Data Source=|DataDirectory|Movies.sdf" providerName="System.Data.SqlServerCe.4.0"/> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings>
This small amount of code and XML is everything you need to write in order to represent and store the movie data in a database.
Next, you’ll build a new MoviesController
class that you can use to display the movie data and allow users to create new movie listings.
ASP.NET MVC part 3 Adding a View
Adding a View
In this section you’re going to modify the HelloWorldController
class to use view template files to cleanly encapsulate the process of generating HTML responses to a client.
You’ll create a view template file using the new Razor view engine introduced with ASP.NET MVC 3. Razor-based view templates have a .cshtml file extension, and provide an elegant way to create HTML output using C#. Razor minimizes the number of characters and keystrokes required when writing a view template, and enables a fast, fluid coding workflow.
Start by using a view template with the Index
method in the HelloWorldController
class. Currently the Index
method returns a string with a message that is hard-coded in the controller class. Change the Index
method to return a View
object, as shown in the following:
public ActionResult Index() { return View(); }
This code uses a view template to generate an HTML response to the browser. In the project, add a view template that you can use with the Index
method. To do this, right-click inside the Index
method and click Add View.
The Add View dialog box appears. Leave the defaults the way they are and click the Add button:
The MvcMovie\Views\HelloWorld folder and the MvcMovie\Views\HelloWorld\Index.cshtml file are created. You can see them in Solution Explorer:
The following shows the Index.cshtml file that was created:
Add some HTML under the <h2>
tag. The modified MvcMovie\Views\HelloWorld\Index.cshtml file is shown below.
@{ ViewBag.Title = "Index"; } <h2>Index</h2> <p>Hello from our View Template!</p>
Run the application and browse to the HelloWorld
controller (http://localhost:xxxx/HelloWorld). The Index
method in your controller didn’t do much work; it simply ran the statement return View()
, which specified that the method should use a view template file to render a response to the browser. Because you didn’t explicitly specify the name of the view template file to use, ASP.NET MVC defaulted to using the Index.cshtml view file in the \Views\HelloWorld folder. The image below shows the string hard-coded in the view.
Looks pretty good. However, notice that the browser’s title bar says “Index” and the big title on the page says “My MVC Application.” Let’s change those.
Changing Views and Layout Pages
First, you want to change the “My MVC Application” title at the top of the page. That text is common to every page. It actually is implemented in only one place in the project, even though it appears on every page in the application. Go to the /Views/Shared folder in Solution Explorer and open the _Layout.cshtml file. This file is called a layout page and it’s the shared “shell” that all other pages use.
Layout templates allow you to specify the HTML container layout of your site in one place and then apply it across multiple pages in your site. Note the @RenderBody()
line near the bottom of the file. RenderBody
is a placeholder where all the view-specific pages you create show up, “wrapped” in the layout page. Change the title heading in the layout template from “My MVC Application” to “MVC Movie App”.
<div id="title"> <h1>MVC Movie App</h1> </div>
Run the application and notice that it now says “MVC Movie App”. Click the About link, and you see how that page shows “MVC Movie App”, too. We were able to make the change once in the layout template and have all pages on the site reflect the new title.
The complete _Layout.cshtml file is shown below:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script> </head> <body> <div class="page"> <header> <div id="title"> <h1>MVC Movie App</h1> </div> <div id="logindisplay"> @Html.Partial("_LogOnPartial") </div> <nav> <ul id="menu"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li> </ul> </nav> </header> <section id="main"> @RenderBody() </section> <footer> </footer> </div> </body> </html>
Now, let’s change the title of the Index page (view).
Open MvcMovie\Views\HelloWorld\Index.cshtml. There are two places to make a change: first, the text that appears in the title of the browser, and then in the secondary header (the <h2>
element). You’ll make them slightly different so you can see which bit of code changes which part of the app.
@{ ViewBag.Title = "Movie List"; } <h2>My Movie List</h2> <p>Hello from our View Template!</p>
To indicate the HTML title to display, the code above sets a Title
property of the ViewBag
object (which is in the Index.cshtml view template). If you look back at the source code of the layout template, you’ll notice that the template uses this value in the <title>
element as part of the <head>
section of the HTML. Using this approach, you can easily pass other parameters between your view template and your layout file.
Run the application and browse to http://localhost:xx/HelloWorld. Notice that the browser title, the primary heading, and the secondary headings have changed. (If you don’t see changes in the browser, you might be viewing cached content. Press Ctrl+F5 in your browser to force the response from the server to be loaded.)
Also notice how the content in the Index.cshtml view template was merged with the _Layout.cshtml view template and a single HTML response was sent to the browser. Layout templates make it really easy to make changes that apply across all of the pages in your application.
Our little bit of “data” (in this case the “Hello from our View Template!” message) is hard-coded, though. The MVC application has a “V” (view) and you’ve got a “C” (controller), but no “M” (model) yet. Shortly, we’ll walk through how create a database and retrieve model data from it.
Passing Data from the Controller to the View
Before we go to a database and talk about models, though, let’s first talk about passing information from the controller to a view. Controller classes are invoked in response to an incoming URL request. A controller class is where you write the code that handles the incoming parameters, retrieves data from a database, and ultimately decides what type of response to send back to the browser. View templates can then be used from a controller to generate and format an HTML response to the browser.
Controllers are responsible for providing whatever data or objects are required in order for a view template to render a response to the browser. A view template should never perform business logic or interact with a database directly. Instead, it should work only with the data that’s provided to it by the controller. Maintaining this “separation of concerns” helps keep your code clean and more maintainable.
Currently, the Welcome
action method in the HelloWorldController
class takes a name
and a numTimes
parameter and then outputs the values directly to the browser. Rather than have the controller render this response as a string, let’s change the controller to use a view template instead. The view template will generate a dynamic response, which means that you need to pass appropriate bits of data from the controller to the view in order to generate the response. You can do this by having the controller put the dynamic data that the view template needs in a ViewBag
object that the view template can then access.
Return to the HelloWorldController.cs file and change the Welcome
method to add a Message
and NumTimes
value to the ViewBag
object. ViewBag
is a dynamic object, which means you can put whatever you want in to it; the ViewBag
object has no defined properties until you put something inside it. The completeHelloWorldController.cs file looks like this:
using System.Web; using System.Web.Mvc; namespace MvcMovie.Controllers { public class HelloWorldController : Controller { public ActionResult Index() { return View(); } public ActionResult Welcome(string name, int numTimes = 1) { ViewBag.Message = "Hello " + name; ViewBag.NumTimes = numTimes; return View(); } } }
Now the ViewBag
object contains data that will be passed to the view automatically.
Next, you need a Welcome view template! In the Debug menu, select Build MvcMovie to make sure the project is compiled.
Then right-click inside the Welcome
method and click Add View. Here’s what the Add View dialog box looks like:
Click Add, and then add the following code under the <h2>
element in the new Welcome.cshtml file. You’ll create a loop that says “Hello” as many times as the user says it should. The complete Welcome.cshtml file is shown below.
@{ ViewBag.Title = "Welcome"; } <h2>Welcome</h2> <ul> @for (int i=0; i < ViewBag.NumTimes; i++) { <li>@ViewBag.Message</li> } </ul>
Run the application and browse to the following URL:
http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4
Now data is taken from the URL and passed to the controller automatically. The controller packages the data into a ViewBag
object and passes that object to the view. The view then displays the data as HTML to the user.
Well, that was a kind of an “M” for model, but not the database kind. Let’s take what we’ve learned and create a database of movies.
ASP.NET MVC part 2 Adding a Controller
Adding a Controller
MVC stands for model-view-controller. MVC is a pattern for developing applications that are well architected and easy to maintain. MVC-based applications contain:
- Controllers: Classes that handle incoming requests to the application, retrieve model data, and then specify view templates that return a response to the client.
- Models: Classes that represent the data of the application and that use validation logic to enforce business rules for that data.
- Views: Template files that your application uses to dynamically generate HTML responses.
We’ll be covering all these concepts in this tutorial series and show you how to use them to build an application.
Let’s begin by creating a controller class. In Solution Explorer, right-click the Controllers folder and then select Add Controller.
Name your new controller “HelloWorldController”. Leave the default template as Empty controller and clickAdd.
Notice in Solution Explorer that a new file has been created named HelloWorldController.cs. The file is open in the IDE.
Inside the public class HelloWorldController
block, create two methods that look like the following code. The controller will return a string of HTML as an example.
using System.Web; using System.Web.Mvc; namespace MvcMovie.Controllers { public class HelloWorldController : Controller { // // GET: /HelloWorld/ public string Index() { return "This is my <b>default</b> action..."; } // // GET: /HelloWorld/Welcome/ public string Welcome() { return "This is the Welcome action method..."; } } }
Your controller is named HelloWorldController
and the first method above is named Index
. Let’s invoke it from a browser. Run the application (press F5 or Ctrl+F5). In the browser, append “HelloWorld” to the path in the address bar. (For example, in the illustration below, it’s http://localhost:43246/HelloWorld.) The page in the browser will look like the following screenshot. In the method above, the code returned a string directly. You told the system to just return some HTML, and it did!
ASP.NET MVC invokes different controller classes (and different action methods within them) depending on the incoming URL. The default mapping logic used by ASP.NET MVC uses a format like this to determine what code to invoke:
/[Controller]/[ActionName]/[Parameters]
The first part of the URL determines the controller class to execute. So /HelloWorld maps to theHelloWorldController
class. The second part of the URL determines the action method on the class to execute. So /HelloWorld/Index would cause the Index
method of the HelloWorldController
class to execute. Notice that we only had to browse to /HelloWorld and the Index
method was used by default. This is because a method named Index
is the default method that will be called on a controller if one is not explicitly specified.
Browse to http://localhost:xxxx/HelloWorld/Welcome. The Welcome
method runs and returns the string “This is the Welcome action method…”. The default MVC mapping is /[Controller]/[ActionName]/[Parameters]
. For this URL, the controller is HelloWorld
and Welcome
is the action method. You haven’t used the[Parameters]
part of the URL yet.
Let’s modify the example slightly so that you can pass some parameter information from the URL to the controller (for example, /HelloWorld/Welcome?name=Scott&numtimes=4). Change your Welcome
method to include two parameters as shown below. Note that the code uses the C# optional-parameter feature to indicate that the numTimes
parameter should default to 1 if no value is passed for that parameter.
public string Welcome(string name, int numTimes = 1) { return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); }
Run your application and browse to the example URL (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4). You can try different values for name
and numtimes
in the URL. The system automatically maps the named parameters from the query string in the address bar to parameters in your method.
In both these examples the controller has been doing the “VC” portion of MVC — that is, the view and controller work. The controller is returning HTML directly. Ordinarily you don’t want controllers returning HTML directly, since that becomes very cumbersome to code. Instead we’ll typically use a separate view template file to help generate the HTML response. Let’s look next at how we can do this.
ASP.NET MVC part 1 Intro to ASP.NET MVC 3
What You’ll Build
You’ll implement a simple movie-listing application that supports creating, editing, and listing movies from a database. Below are two screenshots of the application you’ll build. It includes a page that displays a list of movies from a database:
The application also lets you add, edit, and delete movies, as well as see details about individual ones. All data-entry scenarios include validation to ensure that the data stored in the database is correct.
Skills You’ll Learn
Here’s what you’ll learn:
- How to create a new ASP.NET MVC project.
- How to create ASP.NET MVC controllers and views.
- How to create a new database using the Entity Framework Code First paradigm.
- How to retrieve and display data.
- How to edit data and enable data validation.
Getting Started
Start by running Visual Web Developer 2010 Express (“Visual Web Developer” for short) and select New Project from the Start page.
Visual Web Developer is an IDE, or integrated development environment. Just like you use Microsoft Word to write documents, you’ll use an IDE to create applications. In Visual Web Developer there’s a toolbar along the top showing various options available to you. There’s also a menu that provides another way to perform tasks in the IDE. (For example, instead of selecting New Project from the Start page, you can use the menu and selectFile > New Project.)
Creating Your First Application
You can create applications using either Visual Basic or Visual C# as the programming language. Select Visual C# on the left and then select ASP.NET MVC 3 Web Application. Name your project “MvcMovie” and then click OK. (If you prefer Visual Basic, switch to the Visual Basic version of this tutorial.)
In the New ASP.NET MVC 3 Project dialog box, select Internet Application. Check Use HTML5 markupand leave Razor as the default view engine.
Click OK. Visual Web Developer used a default template for the ASP.NET MVC project you just created, so you have a working application right now without doing anything! This is a simple “Hello World!” project, and it’s a good place to start your application.
From the Debug menu, select Start Debugging.
Notice that the keyboard shortcut to start debugging is F5.
F5 causes Visual Web Developer to start a development web server and run your web application. Visual Web Developer then launches a browser and opens the application’s home page. Notice that the address bar of the browser says localhost
and not something like example.com
. That’s because localhost
always points to your own local computer, which in this case is running the application you just built. When Visual Web Developer runs a web project, a random port is used for the web server. In the image below, the random port number is 43246. When you run the application, you’ll probably see a different port number.
Right out of the box this default template gives you two pages to visit and a basic login page. The next step is to change how this application works and learn a little bit about ASP.NET MVC in the process. Close your browser and let’s change some code.