我有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();
}
答案 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方法内)。