Most elegant way to ensure view model data for _Layout.cshtml

asp.net-mvc-3, c#

Solution

I would create a `BaseController` which retrieves the data in the `Initialize()` override and sets it to a `ViewBag` property. Now derive every Controller you create from `BaseController` and in your layout use the `ViewBag` property to access your user data.

public class BaseController : Controller
{
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        // retireve data
        var data = new ApplicationBaseModel();

        // set to viewbag
        ViewBag.UserData = data;
    }
}

This way you do not have to derive all your model classes from `ApplicationBaseModel`. You can have strongly typed views and additionally your user data as a `ViewBag` property.

Problem

In my application I have some basic user information that needs to be displayed on every page (name, profile img). At the moment I have simply set the model in the `_Layout.cshtml` page to be a class called `ApplicationBaseModel` and every other view model throughout the application must inherit from this class, and every action must set the appropriate data for the base model. I don't mind simple inheritance in this way, it is the fact that in every single action method I must retreive the data and store it in the view model. Not a very elegant solution in my opinion. Anyone have any ideas on other ways of solving this issue?

Original source