Asp.net mvc 获取方法中ActionFilterAttribute的实例
我是ASP.NETMVC平台的新手,我面临以下问题 我正在使用ActionFilterAttribute在操作方法运行之前和之后执行一些例行工作。问题是我需要获取action方法中属性的实例来读取OnActionExecuting方法中设置的一些属性。比如说Asp.net mvc 获取方法中ActionFilterAttribute的实例,asp.net-mvc,attributes,Asp.net Mvc,Attributes,我是ASP.NETMVC平台的新手,我面临以下问题 我正在使用ActionFilterAttribute在操作方法运行之前和之后执行一些例行工作。问题是我需要获取action方法中属性的实例来读取OnActionExecuting方法中设置的一些属性。比如说 public class SomeController : Controller{ public SomeController(){ } [Some] public ActionResult Index(){ SomeModel
public class SomeController : Controller{
public SomeController(){ }
[Some]
public ActionResult Index(){
SomeModel = someRepository.GetSomeModel();
//get instance of some attribute and read SomeProperty
return View(SomeModel);
}
}
public class SomeAttribute : ActionFilterAttribute{
public int SomeProperty { get; set; }
public SomeAttribute(){ }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var parameters = filterContext.ActionParameters;
//Here to set SomeProperty depends on parameters
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//do some work
}
}
有什么想法吗?对不起,我认为这是不可能的。由于SomeProperty的值必须基于发送到属性构造函数中的参数,因此它必须易于计算。我建议添加一些静态方法,从动作中获取值 选项1:Your
ActionFilter
可以向ViewModel
添加信息,例如:
filterContext.Controller.ViewData["YourKey"] = "Value to add";
选项2:您可以将代码放入基本控制器
类中,该类查找已应用于正在执行的方法的所有属性,您可以将它们放入操作方法随后可以使用的成员变量中
e、 g
受保护的覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var attrs=filterContext.ActionDescriptor.GetCustomAttributes(true).OfType();
...
}
编辑:正如其他人所指出的,尝试改变属性是行不通的。过滤器属性必须设计成线程安全的。该框架不保证筛选器属性的单个实例一次只能为一个请求提供服务。有鉴于此,您不能在OnActionExecuting/OnActionExecuted方法中改变属性实例状态 考虑以下备选方案之一:
- 使用HttpContext.Items将值存储在OnActionExecuting中,然后从action方法读取该值。您可以通过传递给OnActionExecuting的filterContext参数访问HttpContext
- 将属性而不是属性放在控制器上,然后让OnActionExecuting方法将控制器强制转换为SomeController,并直接从该方法中设置属性。这将起作用,因为框架默认情况下保证控制器实例是瞬态的;单个控制器实例永远不会为多个请求提供服务
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var attrs = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<Some>();
...
}