Access Viewbag property on all views

后端 未结 4 890
独厮守ぢ
独厮守ぢ 2021-02-14 02:22

How can I access some ViewBag properties across all my views? I want to have some information like current user name, etc accessible everywhere, but without having to to specifi

4条回答
  •  没有蜡笔的小新
    2021-02-14 02:53

    You can achieve what you want in a number of ways, each one with their pros and cons.

    1. With a Base Class

    public class BaseController : Controller
    {
        protected override ViewResult View(IView view, object model)
        {
            this.ViewBag.MyProperty = "value";
            return base.View(view, model);
        }
    }
    

    PROS: Quite simple to implement, few lines of code, highly reusable, can be opted-out at will (see comments below).

    CONS: Being forced to derive all your controllers from a base class might have some impact, especially if you have a lot of controllers already in place and/or you need to derive them from other base classes.

    2. With a Module

    public class ViewBagPropertyModule: Module
    {
        protected override void AttachToComponentRegistration(IComponentRegistry cr,
                                                      IComponentRegistration reg)
        {
            Type limitType = reg.Activator.LimitType;
            if (typeof(Controller).IsAssignableFrom(limitType))
            {
                registration.Activated += (s, e) =>
                {
                    dynamic viewBag = ((Controller)e.Instance).ViewBag;
                    viewBag.MyProperty= "value";
                };
            }
        }
    }
    

    PROS: None I’m aware of.

    CONS: None I’m aware of (except being a bit counterintuitive).

    3. With a RegisterController Hook

    builder.RegisterControllers(asm)
        .OnActivated(e => {
            dynamic viewBag = ((Controller)e.Instance).ViewBag;
            viewBag.MyProperty = "value";
        });
    

    PROS: Fast, secure, reusable: ideal for any IoC design pattern.

    CONS: Not always suited for small project and/or simple websites: if you’re not using IoC you’re often not using RegisterController at all.

    4. With an ActionFilter attribute

    public class MyPropertyActionFilter : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.MyProperty = "value";
        }
    }
    

    and then in your Global.asax.cs file:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalFilters.Filters.Add(new MyPropertyActionFilter(), 0);
    }
    

    PROS: Easily the less-obtrusive method amongst those mentioned.

    CONS: None I’m aware of.

    I also wrote this article on my blog explaining all the above methods.

提交回复
热议问题