2010-10-11 36 views
4

我是ASP.NET MVC平台的新手,我面临以下问题。在方法中获取ActionFilterAttribute的实例

我正在使用ActionFilterAttribute在动作方法运行之前和之后执行一些例行工作。问题是我需要在action方法中获取属性的实例,以读取在OnActionExecuting方法中设置的一些属性。例如

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 
} 
} 

任何想法?

回答

0

对不起,我不相信这是可能的。由于SomeProperty的值必须基于发送到属性构造函数的参数,因此它必须易于计算。我会建议添加一些静态方法来从动作中获取值。

0

选项1:您的ActionFilter可以将信息添加到ViewModel,例如,

filterContext.Controller.ViewData["YourKey"] = "Value to add"; 

选项2:您可以将代码在你的基地Controller类认定,已应用到正在执行方法的所有属性,你可以把它们放在一个成员变量的操作方法可以再使用。

例如

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var attrs = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<Some>(); 
     ... 
    } 

编辑:和其他人一样,试图改变属性是行不通的。

2

过滤器属性必须被设计为线程安全的。该框架并不保证您的过滤器属性的单个实例一次只能处理一个请求。鉴于此,您不能在OnActionExecuting/OnActionExecuted方法内改变属性实例状态。

考虑其中的一个作为替代方案:

  • 使用HttpContext.Items来存储OnActionExecuting值,然后从操作方法读取它。您可以通过传递给OnActionExecuting的参数filterContext来访问HttpContext。

  • 将属性放在控制器而不是属性上,然后让OnActionExecuting方法将控制器转换为SomeController并直接从该方法中设置属性。这将起作用,因为默认框架确保控制器实例是暂时的;一个控制器实例永远不会服务多个请求。

相关问题