Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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
C# 向特定操作方法动态添加操作筛选器_C#_Asp.net Mvc_Actionfilterattribute - Fatal编程技术网

C# 向特定操作方法动态添加操作筛选器

C# 向特定操作方法动态添加操作筛选器,c#,asp.net-mvc,actionfilterattribute,C#,Asp.net Mvc,Actionfilterattribute,一个问题的几个故事 我实现了一个类MyClass,它有一个超时回调,应该在响应发送到客户端之后立即启动。我可以使用ActionFilter来实现这一点,但由于用户方便,我不喜欢显式使用ActionFilter。而是在动作方法主体中实例化MyClass时附加动作过滤器 我遇到一种情况,需要启动一个函数委托,用于在执行操作后跟踪超时事件 考虑一个类,设计用于在实例在该操作方法上启动时执行的操作方法之后运行一些代码 我需要在一个特定的操作执行后执行一些代码,它的结果是我有它的操作的名称 我知道使用自定

一个问题的几个故事

我实现了一个类MyClass,它有一个超时回调,应该在响应发送到客户端之后立即启动。我可以使用ActionFilter来实现这一点,但由于用户方便,我不喜欢显式使用ActionFilter。而是在动作方法主体中实例化MyClass时附加动作过滤器

我遇到一种情况,需要启动一个函数委托,用于在执行操作后跟踪超时事件

考虑一个类,设计用于在实例在该操作方法上启动时执行的操作方法之后运行一些代码

我需要在一个特定的操作执行后执行一些代码,它的结果是我有它的操作的名称

我知道使用自定义动作过滤器并实现它的OnActionExecuted方法是一种方法,但我想知道的是,如何在动作执行时动态附加该动作过滤器。 我的意思是,如何附加一个操作筛选器而不在Global.asax中订阅它,也不使用[MyCustomActionFilter]在操作方法上方指定它

编辑:

假设我有以下课程:

public class MyClass
{
  public List<SomeDelegate> TimeoutCallbackFunction{get; set;}

  public MyClass()
  {
     // I want to attach action filter here.
     // user may forget to attach MyFilter filter to Action Method
     // So that it would be easier for users if this handled by MyClass Constructor.
     HttpContext.Current....... or something
  }
}
因此,在控制器中,我有以下代码:

//I want following filter attach to be removed.
//[MyFilter]
public ActionResult MyAction()
{
   // This piece of code, should attach action method with 'MyFilter' filter
   // And dismiss user from nominate it above of 'MyAction' action method
   MyClass myObject=new MyClass();
}
顺便说一句,用户是指使用我的类并基于我的DLL开发mvc.asp的用户

我的问题是: 1-是否可以将操作筛选器附加到当前正在执行的操作?如果是,怎么做? 2-如果这是不可能的,那么在结果执行之后,我还必须运行一些代码吗?
3-如果没有其他选择,那么在这种情况下人们会怎么做?有没有标准化的方法来触发计时器回调?

也许操作过滤器不是解决问题的好方法。然而,您是否考虑过在某个地方创建一个简单的标志,并在希望执行操作过滤器功能时将其设置为true?例如:

在代码中设置标志:

HttpContext.Current.Items["ExecuteMyActionFilter"] = true
在动作过滤器中:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if ((bool?) HttpContext.Current.Items["ExecuteMyActionFilter"] == true)
    {
        // Execute your code
    }
}

您可以使用静态变量、数据库或任何状态条件来检查是否需要执行操作。希望你有这个想法

@Rzassar仍然,答案是一样的。我没有找到更好的方法。问题是,我应该在哪里将筛选器附加到操作?我的意思是,当我想省略按用户手动筛选注册并将用户从这种复杂性中释放出来时,应该如何调用OnActionExecuted。我宁愿强制用户调用[MyFilter]上面它所需的操作方法,而不是强制用户关闭或打开标志。顺便说一句,我所说的用户是指使用我的类并基于我的DLL开发mvc.asp的用户。伙计,你必须根据条件做一些事情,也许你不应该使用操作过滤器解决你的问题。这是我的印象…@Andrei对你完全正确。另一方面,正如我提到的,如何附加一个操作筛选器,而不在Global.asax中订阅它,也不使用[MyCustomActionFilter]在操作方法上方指定它。我的意思是,如何在不需要静态注册的情况下实现action filter>>>OnAction等功能。现在您认为在将响应分派到客户机之前,是否有其他方法来执行某些代码?
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if ((bool?) HttpContext.Current.Items["ExecuteMyActionFilter"] == true)
    {
        // Execute your code
    }
}