【问题标题】:How to set values to ViewBag in ActionFilterAttribute ASP MVC 5?如何在 ActionFilterAttribute ASP MVC 5 中为 ViewBag 设置值?
【发布时间】:2014-08-16 00:04:17
【问题描述】:

您好,我想为我的应用程序中的每个控制器创建自定义 ActionFilterAttribute,该属性应该设置一些 ViewBag 值。 ActionFilterAttribute 是否适合它以及如何访问 ActionFilterAttribute 中的 viewbag ?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    你可以这样做

    public class SomeMsgAttribute : FilterAttribute, IResultFilter
    {
            public void OnResultExecuted(ResultExecutedContext filterContext)
            {
            }
    
            public void OnResultExecuting(ResultExecutingContext filterContext)
            {
                filterContext.Controller.ViewBag.Msg= "Hello";
            }
    }
    

    使用:

    [SomeMsg]
    public ActionResult Index()
    {
        return View();
    }
    

    【讨论】:

    • 你有什么解释为什么这在Executing 中有效,但在Executed 中无效?
    • @TolgaEvcimen OnResultExecuted 在渲染剃刀视图后调用。到那个时候,改变输出已经太迟了。
    • 我明白了,我一直以为OnResultExecuted是在action方法返回后立即调用的,可惜:)我应该想到的:)谢谢。
    【解决方案2】:

    试试这个

    public class CustomFilterAttribute : ActionFilterAttribute
    {
        public override void
        OnActionExecuting(ActionExecutingContext filterContext)
        {
            //  get the view bag
    
            var viewBag = filterContext.Controller.ViewBag;
    
            // set the viewbag values
            viewBag.CustomValue = "CustomValue";
        }
    }
    

    【讨论】:

      【解决方案3】:

      对于 ASP.NET Core,您可以执行以下操作

      public class SomeFilterAttribute : IActionFilter
      {
           public void OnActionExecuting(ActionExecutingContext context)
           {
               Controller controller = context.Controller as Controller;
      
               controller.ViewBag.CustomValue = customVal;
               controller.ViewData["CustomValue "] = customVal;
               controller.TempData["CustomValue "] = customVal;
           }
      }
      

      然后从控制器

          [TypeFilter(typeof(ValidateAppFeatureEnabled))]
          public IActionResult Index()
          {
              var foo = ViewBag.CustomValue;
              var bar = (type)ViewData["CustomValue"];
              var buzz = (type)TempData["CustomValue"];
      
              // Whatever else you need to do
      
              return View();
          }
      

      【讨论】:

        【解决方案4】:

        从不同的控制器动作传输数据

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            EmployeeTrackingSystemAndMISEntities db = new EmployeeTrackingSystemAndMISEntities();
        
            var UserCookie = filterContext.HttpContext.Request.Cookies["UserUniqueID"];
        
        
            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
            redirectTargetDictionary.Add("action", "UserLogIn");
            redirectTargetDictionary.Add("controller", "Login");
        
            var TempData = filterContext.Controller.TempData;
            TempData["Status"] = "Please log in as Admin";
        
            filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-12-15
          • 1970-01-01
          • 2015-09-13
          • 2014-05-21
          • 2014-04-26
          • 2020-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多