Create an action filter and decorate your controller classes. Inside the action filter you have access to put values in the viewbag which are available to your layout.
This will run on each request and you will not have to set the values in each action. You can look for and ignore things like a child request and ajax requests which typically do not use the layout anyways and not set your viewbag values for those.
Below is a sample of an attribute i created to copy an object from the session and make it available to the layout via the ViewBag
public class CurrentUserAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
// Don't bother running this for child action or ajax requests
if (!filterContext.IsChildAction && !filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
if (filterContext.HttpContext.Session != null)
{
var currentUser = filterContext.HttpContext.Session["CurrentUser"] as CurrentUser;
if (currentUser != null)
{
filterContext.Controller.ViewBag.CurrentUser = currentUser;
}
}
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…