Question

Basically, I want to inject some data into ViewData/ViewBag for every single request.

Was it helpful?

Solution

In ASP.NET MVC that would be an action filter. And if you want to do it globally you could register it as a global action filter. This way it will apply to all controller actions so that you don't need to decorate them individually.

So your filter could be defined like this:

public class GlobalViewBagInjectorActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.Controller.ViewBag.Foo = "bar";
    }
}

and registered in the RegisterGlobalFilters method in your Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new GlobalViewBagInjectorActionFilter());
}

Now inside all your views you can use the ViewBag.Foo property.

But in most situations Child Actions are a better alternative than ViewBag as they allow you to pass strongly typed view models instead of relying on this weakly typed ViewBag and some magic strings.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top