La estrategia que utilizo es tener un modelo de vista de base a partir del cual se derivan todos mis modelos de vista. Utilizo un controlador base, aunque también podría usar un filtro global y anular OnActionExecuted. Cuando detecto una acción que devuelve un ViewResult, echo el modelo a mi modelo de vista base y establezco las propiedades comunes en el modelo desde el controlador base.
La elección entre un filtro global y un controlador base depende de una variedad de factores. Si realmente se aplica a todas las acciones (que devuelven los resultados de la vista) y no necesita inyección para acceder a algunos recursos, entonces probablemente vaya con el filtro. Si necesita tener dependencias inyectadas o si tiene algunos controladores donde los datos se aplicarían y otros donde no (por ejemplo, el controlador de administración), iría a la ruta del controlador base. Deberá recordar derivar del controlador si lo acepta.
También podría hacer lo mismo con la ViewBag si no desea derivar de un modelo de vista común. Me gusta tener el modelo fuertemente tipado, pero YMMV.
Si está utilizando la COI, esto es un blog que escribí no hace mucho tiempo que muestra una aproximación única: http://crazorsharp.blogspot.com /2011/03/master-page-model-in-aspnet-mvc-3-using.html – BFree