Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 获取方法中ActionFilterAttribute的实例_Asp.net Mvc_Attributes - Fatal编程技术网

Asp.net mvc 获取方法中ActionFilterAttribute的实例

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

我是ASP.NETMVC平台的新手,我面临以下问题

我正在使用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
}
}

有什么想法吗?

对不起,我认为这是不可能的。由于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>();
        ...
    }