Asp.net mvc 如何在ActionFilterAttribute ASP MVC 5中设置ViewBag的值?

Asp.net mvc 如何在ActionFilterAttribute ASP MVC 5中设置ViewBag的值?,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,您好,我想为应用程序中的每个控制器创建自定义ActionFilterAttribute,该属性应该设置一些ViewBag值。是否可以使用ActionFilterAttribute以及如何在ActionFilterAttribute中访问viewbag?您可以这样做 public class SomeMsgAttribute : FilterAttribute, IResultFilter { public void OnResultExecuted(ResultExecutedC

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

您可以这样做

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();
}
试试这个

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";
    }
}

从其他控制器操作传输数据的步骤

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);

}

对于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();
    }

您是否有任何解释,说明为什么它在执行中起作用,而在执行中不起作用?@TolgaEvcimen
OnResultExecuted
在呈现razor视图后被调用。到那时,更改输出已经太晚了。我明白了,我一直认为它是在action方法返回后立即调用的
OnResultExecuted
,可惜:)我应该认为:)谢谢。