c#属性和重写行为asp.net mvc

c#属性和重写行为asp.net mvc,c#,asp.net,asp.net-mvc,attributes,C#,Asp.net,Asp.net Mvc,Attributes,我有一个事务属性,它在onactionexecuted方法中执行提交 这是在控制器方法中指定的,对于我的一个操作,我需要重写该方法,而不是调用onactionexecuted中的代码 下面是一些示例代码 [Transaction] public class TestController { public ActionResult Index() { return View(); } [NoTransaction] public Actio

我有一个事务属性,它在onactionexecuted方法中执行提交

这是在控制器方法中指定的,对于我的一个操作,我需要重写该方法,而不是调用onactionexecuted中的代码

下面是一些示例代码

[Transaction]
public class TestController
{
    public ActionResult Index()
    {
        return View();
    }

    [NoTransaction]
    public ActionResult Test()
    {
        return View();
    }
}
[NotTransaction]属性应覆盖[Transaction]中的onactionexecuted方法。
有什么方法可以做到这一点吗?

nottransaction
属性的
OnActionExecuting
中,您可以在
HttpContext.Items
中放置某种标志,然后在
事务
属性的
onactionexecutive
中检查这些项目。或者是一些变化

HTHs,

Charles

所有操作筛选器都具有order属性。如果未定义,则其隐式值为-1。当过滤器具有相同的顺序时,顺序由作用域确定:是应用于控制器还是应用于操作

相同顺序的控制器作用域筛选器在相同顺序的操作筛选器之前运行

简单的解决方法是对事务属性应用显式排序

[Transaction(Order=1)]
public class TestController
{
    public ActionResult Index()
    {
        return View();
    }

    [NoTransaction(Order=0)]
    public ActionResult Test()
    {
        return View();
    }
}
这将确保NotTransaction在事务之前运行


如果希望NotTransaction覆盖事务,最简单的方法是让NotTransaction在事务属性读取的HttpContext.Items中添加一些特殊的键。此键的存在将告诉事务属性不要做任何事情。

如果您的NotTransactionAttribute是一个筛选器,您可以按照另一篇文章中的建议在其OnActionExecuting()中设置一个标志。否则:

// just a marker attribute with no special logic
public sealed class NoTransactionAttribute : Attribute { }

public class TransactionAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        if (filterContext.ActionDescriptor.IsDefined(typeof(NoTransactionAttribute), true /* inherit */)
            || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(NoTransactionAttribute), true /* inherit */) {
                return; // should skip logic
        }

        // perform your logic here
    }
}

请提供一些代码来说明您的问题。[NotTransaction]是否首先运行?我想顺序是:
Transaction.OnActionExecuting
->
NotTransaction.OnActionExecuting
NotTransaction.OnActionExecuted
Transaction.OnActionExecuted
它吸收了ActionDescriptor.IsDefined(typeof(Foo),true)实际上没有正确使用继承。例如,控制器具有[Authorize],由操作继承,但ActionDescriptor.IsDefined方法返回false。