如何将参数从action传递给ActionFilterAttribute代码

时间:2013-08-12 14:10:09

标签: asp.net-mvc asp.net-mvc-4 action-filter

我有ActionFilterAttribute,如下所示

class MyCustomRouteConstraint : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (something == 1) //i know there is no something variable
        { 
           // do something
        }
        base.OnActionExecuting(filterContext);
    }

}

正如您在我的代码中看到的那样,没有任何变量被命名为某种东西。 但是我想在我的动作中使用名为some的变量。

    public ActionResult Index()
    {
        int something = 1;
        return View();
    }

    public ActionResult About()
    {
        int something = 2;
        return View();
    }

    public ActionResult Contact()
    {
        int something = 1;
        return View();
    }

5 个答案:

答案 0 :(得分:1)

我认为你需要的是OnActionExecuted。我没有测试过。

class MyCustomRouteConstraint : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var something = Convert.ToInt32(filterContext.RouteData.Values["something"]);
        if(something == 1)
        {
            //do something
        }
        base.OnActionExecuting(filterContext);
    }
}

答案 1 :(得分:0)

我使用结构图依赖注入来做到这一点。在这里看到一些片段:

namespace something.Infrastructure.ActionFilters {

  public class PlatformAuthorizeAttribute : AuthorizeAttribute
  {
      public IRepository<User> UserRepo { get; set; }

      public override void OnAuthorization(AuthorizationContext filterContext)
      {
          base.OnAuthorization(filterContext);

          if (WebSecurity.Initialized && filterContext.HttpContext.User.Identity.IsAuthenticated)
          {
              if (filterContext.HttpContext.User.IsInRole("Banned"))
              {
                  WebSecurity.Logout();
                  filterContext.Result = new RedirectToRouteResult(
                      new RouteValueDictionary
                          {
                            {"Controller", "Home"},
                            {"Action", "Banned"},
                            {"Area", ""}
                          });
              }
              UserRepo.Dispose();
              UserRepo = null;
          }  
      }
  }
}

然后在IoC结构图类中初始化以下映射:

public static class IoC
{
    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                    {
                        scan.TheCallingAssembly();
                        scan.WithDefaultConventions();
                    });
                x.SetAllProperties(pset =>
                    {
                        pset.WithAnyTypeFromNamespace("something.Infrastructure.ActionFilters");
                        pset.OfType<IRepository<User>>();
                    });
            });
        return ObjectFactory.Container;
    }
}

我认为这是为您的操作过滤器提供属性的最简洁方法。请注意,在我的示例中,我使用了自定义AuthorizeAttribute。您需要将其更改为ActionFilterAttribute,并使用OnActionExecuting方法覆盖来访问属性。

答案 2 :(得分:0)

在动作方法执行之前,ASP.NET MVC框架会调用OnActionExecuting。因此,在动作体中初始化某事变量没有意义。但是,如果你要覆盖一些在操作方法执行后调用的方法,你可以使用ViewBag在控制器中初始化变量,然后使用filterContext获取它的值。

答案 3 :(得分:0)

您也可以使用ViewBag。

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewBag.SommeVariable = "Test";
    }

在你的行动中

    public ActionResult Index()
    {
        var variable = ViewBag.SommeVariable;
        return View();
    }

答案 4 :(得分:-1)

使用HttpContext.Items

HttpContext.Items["something"] = 1;

在ActionFilter中,您可以按以下方式访问它:

var something = (int)filterContext.HttpContext.Items["something"];

但是,您的动作过滤器示例是OnActionExecuting;这将在执行任何Index / About操作之前执行。所以你应该根据你的需要在其他地方初始化'某事'(例如,在控制器的OnActionExecuting方法内)。