MVC :: Passing Data to View Master Pages



Similar documents
MVC :: Passing Data to View Master Pages

In this tutorial, you learn how to create a new view master page and create a new view content page based on the master page.

Displaying a Table of Database Data (VB)

Chapter 2 HTML Basics Key Concepts. Copyright 2013 Terry Ann Morris, Ed.D

Web Building Blocks. Joseph Gilbert User Experience Web Developer University of Virginia Library

ANGULAR JS SOFTWARE ENGINEERING FOR WEB SERVICES HASAN FAIZAL K APRIL,2014

İNTERNET TABANLI PROGRAMLAMA- 13.ders GRIDVIEW, DETAILSVIEW, ACCESSDATASOURCE NESNELERİ İLE BİLGİ GÖRÜNTÜLEME

Concordion. Concordion. Tomo Popovic, tp0x45 [at] gmail.com

Basic Website Maintenance Tutorial*

QQ WebAgent Quick Start Guide

Introduction to Web Design Curriculum Sample

WORKSHARE CONNECT SHAREPOINT INTEGRATION

Web Development 1 A4 Project Description Web Architecture

CSS Techniques: Scrolling gradient over a fixed background

XHTML BASICS. Institute of Finance Management CIT Department Herman Mandari

7 The Shopping Cart Module

Advanced Tornado TWENTYONE Advanced Tornado Accessing MySQL from Python LAB

Web Design Basics. Cindy Royal, Ph.D. Associate Professor Texas State University

AliPay International Services

Yandex.Widgets Quick start

HOW TO CREATE THEME IN MAGENTO 2

OPENTABLE RESERVATION WIDGET GETTING STARTED ADD RESERVATIONS TO YOUR WEBSITE

Website Planning Checklist

So we're set? Have your text-editor ready. Be sure you use NotePad, NOT Word or even WordPad. Great, let's get going.

JavaScript: Introduction to Scripting Pearson Education, Inc. All rights reserved.

Building Dynamic Websites With the MVC Pattern. ACM UIUC, 2010

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

HTML5 and CSS3 Part 1: Using HTML and CSS to Create a Website Layout

The MVC Programming Model

JavaScript: Arrays Pearson Education, Inc. All rights reserved.

Cascading Style Sheets (CSS)

Step by step guides. Deploying your first web app to your FREE Azure Subscription with Visual Studio 2015

JavaScript By: A. Mousavi & P. Broomhead SERG, School of Engineering Design, Brunel University, UK

HTML CSS Basic Structure. HTML Structure [Source Code] CSS Structure [Cascading Styles] DIV or ID Tags and Classes. The BOX MODEL

Implementing Specialized Data Capture Applications with InVision Development Tools (Part 2)

Web Design with Dreamweaver Lesson 4 Handout

Direct Post Method (DPM) Developer Guide

HTML Basics(w3schools.com, 2013)

Configuring iplanet 6.0 Web Server For SSL and non-ssl Redirect

Developing XML Solutions with JavaServer Pages Technology

HTML, CSS, XML, and XSL

5.1 Radical Notation and Rational Exponents

How to code, test, and validate a web page

HTML & XHTML Tag Quick Reference

JavaScript: Control Statements I

Website Login Integration

MillMedia Guidelines

INTERNET PROGRAMMING AND DEVELOPMENT AEC LEA.BN Course Descriptions & Outcome Competency

Web Development CSE2WD Final Examination June (a) Which organisation is primarily responsible for HTML, CSS and DOM standards?

WIRIS quizzes web services Getting started with PHP and Java

Web Design and Databases WD: Class 7: HTML and CSS Part 3

Running a Load Flow Analysis

Sample HP OO Web Application

Working with forms in PHP

CSS - Cascading Style Sheets

<script type="text/javascript"> var _gaq = _gaq []; _gaq.push(['_setaccount', 'UA ']); _gaq.push(['_trackpageview']);

Further web design: HTML forms

Secure Application Development with the Zend Framework

Viewing Web Pages In Python. Charles Severance -

Copy/Paste Best Practices. Identifying Issues Caused by Copy/Paste. Blackboard General Tutorial

The number of parameters required for authoring an ipart depends on the type of the part you are publishing.

>

Improving Madcap Flare SEO

13 Classes & Objects with Constructors/Destructors

Your First Web Page. It all starts with an idea. Create an Azure Web App

Entity Framework 5 Code First in MVC 4 for beginners

WEB PROGRAMMING LAB (Common to CSE & IT)

Configuring Tomcat for a Web Application

Design and Functional Specification

Adding and Subtracting Positive and Negative Numbers

Chapter 1 Programming Languages for Web Applications

Technical University of Sofia Faculty of Computer Systems and Control. Web Programming. Lecture 4 JavaScript

PLAYER DEVELOPER GUIDE

ITNP43: HTML Lecture 4

Short notes on webpage programming languages

Hello World RESTful web service tutorial

Website Development. 2 Text. 2.1 Fonts. Terry Marris September We see how to format text and separate structure from content.

MASTERTAG DEVELOPER GUIDE

Building Web Applications with HTML5, CSS3, and Javascript: An Introduction to HTML5

Deep in the CRUD LEVEL 1

Web Design & Development - Tutorial 04

LAB 1: Getting started with WebMatrix. Introduction. Creating a new database. M1G505190: Introduction to Database Development

Abusing HTML5. DEF CON 19 Ming Chow Lecturer, Department of Computer Science TuCs University Medford, MA

ASP.NET Web Pages Using the Razor Syntax

Transcription:

MVC :: Passing Data to View Master Pages The goal of this tutorial is to explain how you can pass data from a controller to a view master page. We examine two strategies for passing data to a view master page. First, we discuss an easy solution that results in an application that is difficult to maintain. Next, we examine a much better solution that requires a little more initial work but results in a much more maintainable application. The Problem Imagine that you are building a movie database application and you want to display the list of movie categories on every page in your application (see Figure 1). Imagine, furthermore, that the list of movie categories is stored in a database table. In that case, it would make sense to retrieve the categories from the database and render the list of movie categories within a view master page. Figure 1 Displaying movie categories in a view master page Here s the problem. How do you retrieve the list of movie categories in the master page? It is tempting to call methods of your model classes in the master page directly. In other words, it is tempting to include the code for retrieving the data from the database right in your master page. However, bypassing your MVC controllers to access the database would violate the clean separation of concerns that is one of the primary benefits of building an MVC application. In an MVC application, you want all interaction between your MVC views and your MVC model to be handled by your MVC controllers. This separation of concerns results in a more maintainable, adaptable, and testable application. In an MVC application, all data passed to a view including a view master page should be passed to a view by a controller action. Furthermore, the data should be passed by taking

advantage of view data. In the remainder of this tutorial, I examine two methods of passing view data to a view master page. The Simple Solution Let s start with the simplest solution to passing view data from a controller to a view master page. The simplest solution is to pass the view data for the master page in each and every controller action. Consider the controller in Listing 1. It exposes two actions named Index() and Details(). The Index() action method returns every movie in the Movies database table. The Details() action method returns every movie in a particular movie category. Listing 1 Controllers\HomeController.vb <HandleError()> _ Public Class HomeController Inherits System.Web.Mvc.Controller Private _datacontext As New MovieDataContext() ''' Show list of all movies Function Index() ViewData("categories") = From c In _datacontext.moviecategories _ Select c ViewData("movies") = From m In _datacontext.movies _ ''' Show list of movies in a category Function Details(ByVal id As Integer) ViewData("categories") = From c In _datacontext.moviecategories _ Select c ViewData("movies") = From m In _datacontext.movies _

Where m.categoryid = id _ End Class Notice that both the Index() and the Details() actions add two items to view data. The Index() action adds two keys: categories and movies. The categories key represents the list of movie categories displayed by the view master page. The movies key represents the list of movies displayed by the Index view page. The Details() action also adds two keys named categories and movies. The categories key, once again, represents the list of movie categories displayed by the view master page. The movies key represents the list of movies in a particular category displayed by the Details view page (see Figure 2). Figure 2 The Details view The Index view is contained in Listing 2. It simply iterates through the list of movies represented by the movies item in view data.

Listing 2 Views\Home\Index.aspx <%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %> <%@ Import Namespace="MvcApplication1" %> <asp:content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <ul> <% For Each m In ViewData("movies")%> <li><%= m.title %></li> <% Next%> </ul> </asp:content> The view master page is contained in Listing 3. The view master page iterates and renders all of the movie categories represented by the categories item from view data. Listing 3 Views\Shared\Site.master <%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site.Master.vb" Inherits="MvcApplication1.Site" %> <%@ Import Namespace="MvcApplication1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="head1" runat="server"> <title></title> <asp:contentplaceholder ID="head" runat="server"> </asp:contentplaceholder> </head> <body> <div> <h1>my Movie Website</h1>

<% For Each c In ViewData("categories")%> <%=Html.ActionLink(c.Name, "Details", New With {.id = c.id})%> <% Next%> <asp:contentplaceholder ID="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </body> </html> All data is passed to the view and the view master page through view data. That is the correct way to pass data to the master page. So, what s wrong with this solution? The problem is that this solution violates the DRY (Don t Repeat Yourself) principle. Each and every controller action must add the very same list of movie categories to view data. Having duplicate code in your application makes your application much more difficult to maintain, adapt, and modify. The Good Solution In this section, we examine an alternative, and better, solution to passing data from a controller action to a view master page. Instead of adding the movie categories for the master page in each and every controller action, we add the movie categories to the view data only once. All view data used by the view master page is added in an Application controller. The ApplicationController class is contained in Listing 4. Listing 4 Controllers\ApplicationController.vb Public MustInherit Class ApplicationController Inherits System.Web.Mvc.Controller Private _datacontext As New MovieDataContext() Public ReadOnly Property DataContext() As MovieDataContext

Get End Get End Property Return _datacontext Sub New() ViewData("categories") = From c In DataContext.MovieCategories _ End Sub Select c End Class There are three things that you should notice about the Application controller in Listing 4. First, notice that the class inherits from the base System.Web.Mvc.Controller class. The Application controller is a controller class. Second, notice that the Application controller class is a MustInherit class. An MustInherit class is a class that must be implemented by a concrete class. Because the Application controller is an MustInherit class, you cannot not invoke any methods defined in the class directly. If you attempt to invoke the Application class directly then you ll get a Resource Cannot Be Found error message. Third, notice that the Application controller contains a constructor that adds the list of movie categories to view data. Every controller class that inherits from the Application controller calls the Application controller s constructor automatically. Whenever you call any action on any controller that inherits from the Application controller, the movie categories is included in the view data automatically. The Movies controller in Listing 5 inherits from the Application controller. Listing 5 Controllers\MoviesController.vb <HandleError()> _ Public Class MoviesController Inherits ApplicationController ''' Show list of all movies Function Index()

ViewData("movies") = From m In DataContext.Movies _ ''' Show list of movies in a category Function Details(ByVal id As Integer) ViewData("movies") = From m In DataContext.Movies _ Where m.categoryid = id _ End Class The Movies controller, just like the Home controller discussed in the previous section, exposes two action methods named Index() and Details(). Notice that the list of movie categories displayed by the view master page is not added to view data in either the Index() or Details() method. Because the Movies controller inherits from the Application controller, the list of movie categories is added to view data automatically. Notice that this solution to adding view data for a view master page does not violate the DRY (Don t Repeat Yourself) principle. The code for adding the list of movie categories to view data is contained in only one location: the constructor for the Application controller. Summary In this tutorial, we discussed two approaches to passing view data from a controller to a view master page. First, we examined a simple, but difficult to maintain approach. In the first section, we discussed how you can add view data for a view master page in each every controller action in your application. We concluded that this was a bad approach because it violates the DRY (Don t Repeat Yourself) principle. Next, we examined a much better strategy for adding data required by a view master page to view data. Instead of adding the view data in each and every controller action, we added the view data only once within an Application controller. That way, you can avoid duplicate code when passing data to a view master page in an ASP.NET MVC application.