ActionFilter的ViewData在Base Controller属性中不可用

时间:2012-05-29 10:51:06

标签: .net asp.net-mvc asp.net-mvc-3 actionfilterattribute

我有这样的基础控制器

  [Action]
  public abstract class ApplicationController : Controller
  {
     public bool HasRight { get { return ((bool)ViewData["Actions2"]); } }        
  .........
  }

动作属性

public class ActionAttribute : ActionFilterAttribute
{
   public override void OnActionExecuted(ActionExecutedContext filterContext)
   {
      filterContext.Controller.ViewData["Actions2"]=true;
      .........
   }

} 

当我从某个控制器调用某个视图时,我在

处得到null异常
public bool HasRight { get { return ((bool)ViewData["Actions2"]); } } as ViewData is null

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找在您的控制器操作之前执行的OnActionExecuting,而不是OnActionExecuted

这应该有效:

protected override void OnActionExecuting(ActionExecutingContext filterContext) {
    filterContext.Controller.ViewData["Actions2"]) = true;
}

答案 1 :(得分:1)

您需要从ViewData获取FilterContext,例如:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["Actions2"] = true;
        base.OnActionExecuting(filterContext);
    }

更新:

更新后我意识到您在设置值之前尝试访问ViewData["Actions2"]

因此,您应该使用OnActionExecuting代替OnActionExecuted来确保将值设置为ViewData