如何在ActionFilterAttribute ASP MVC 5中为ViewBag设置值?

Arb*_*æde 28 asp.net-mvc asp.net-mvc-5

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

Ily*_*lya 66

你可以这样做

public class SomeMsgAttribute : FilterAttribute, IResultFilter
{
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
        }

        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.Msg= "Hello";
        }
}
Run Code Online (Sandbox Code Playgroud)

使用:

[SomeMsg]
public ActionResult Index()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

  • @TolgaEvcimen在渲染剃刀视图后调用OnResultExecuted`.到那时,改变输出为时已晚. (2认同)

Ant*_*ash 12

试试这个

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";
    }
}
Run Code Online (Sandbox Code Playgroud)


Mka*_*fut 6

对于 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;
     }
}
Run Code Online (Sandbox Code Playgroud)

然后从控制器

    [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();
    }
Run Code Online (Sandbox Code Playgroud)