Basically, I want to inject some data into ViewData/ViewBag for every single request.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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.