ASP.NET
MVC
Master Page
Data Passing
Web Development

Passing data to Master Page in ASP.NET MVC

Master System Design with Codemia

Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.

Introduction

In ASP.NET MVC (Razor layouts replacing classic master pages), shared layout data is commonly needed for navigation menus, user info, notifications, and branding. The key is passing data to layout in a maintainable way without duplicating controller logic.

The usual approaches are ViewBag, strongly typed view models, child actions/components, and action filters. For scalable projects, prefer reusable services and strongly typed patterns over scattered dynamic values.

Core Sections

1. Simple ViewBag approach

Controller:

csharp
1public ActionResult Index()
2{
3    ViewBag.PageTitle = "Dashboard";
4    ViewBag.CurrentUser = User.Identity.Name;
5    return View();
6}

Layout (_Layout.cshtml):

cshtml
<title>@ViewBag.PageTitle</title>
<span>Hello, @ViewBag.CurrentUser</span>

Quick and easy, but weakly typed.

2. Base controller for shared layout data

csharp
1public abstract class AppController : Controller
2{
3    protected override void OnActionExecuting(ActionExecutingContext filterContext)
4    {
5        ViewBag.CurrentUser = User?.Identity?.Name;
6        base.OnActionExecuting(filterContext);
7    }
8}

All controllers inheriting AppController get common layout values.

3. Strongly typed layout data model

Create dedicated class:

csharp
1public class LayoutInfo
2{
3    public string CurrentUser { get; set; }
4    public int NotificationCount { get; set; }
5}

Attach to view model or use a view component/partial with explicit model.

4. View component style for reusable sections

For dynamic top bars and menus, use a component that fetches data independently. This avoids bloating every controller action.

5. Keep layout data retrieval efficient

Layout executes on every page. Cache expensive shared data (for example navigation tree) and avoid per-request heavy DB calls.

Common Pitfalls

  • Duplicating layout data assignment in every controller action.
  • Overusing dynamic ViewBag keys and introducing runtime typos.
  • Querying database from layout directly and harming performance.
  • Mixing page-specific and global layout state without clear boundaries.
  • Forgetting to provide fallback values for anonymous users.

Summary

Passing data to ASP.NET MVC layouts should be centralized and explicit. ViewBag works for small cases, but base controllers, strongly typed models, and reusable components scale better. Keep shared data retrieval efficient and avoid duplicating logic per action. With a clean layout-data strategy, UI consistency improves while controller complexity stays controlled.

A practical way to make this guidance durable is to turn it into an executable runbook instead of leaving it as passive documentation. The runbook should include exact prerequisites, supported versions, required environment variables, and a short verification checklist. Each step should have expected output and one known failure signature so engineers can quickly classify whether they are on the happy path or hitting a known edge case. This structure is especially valuable in parallel team environments where context switches are frequent and not everyone has the same historical knowledge of the system.

It is also useful to keep a minimal reproducible fixture in source control. That fixture can be a small script, test input, sample request, or tiny deployment manifest that demonstrates both success and controlled failure behavior. When dependencies or infrastructure change, this fixture gives a fast signal about compatibility drift. Instead of debugging deep in production workflows, teams can run a focused check in minutes and identify if the regression came from tooling updates, configuration changes, or logic modifications. Reproducible fixtures also improve onboarding by showing the shortest end-to-end path.

For long-term quality, add one lightweight CI guardrail for the most failure-prone step in the workflow. Examples include schema linting, startup smoke checks, deterministic unit tests, API contract assertions, and compatibility probes for key dependencies. Keep guardrails fast and specific so failures are actionable and developers can fix issues without searching logs for long periods. If a class of issue repeats more than once, promote the corresponding manual troubleshooting step into automation. Over time, this shifts effort from reactive firefighting to preventive engineering and keeps the article aligned with real operating conditions.


Course illustration
Course illustration

All Rights Reserved.