Все фильтры действий имеют свойство заказа. Если он не определен, он имеет неявное значение -1. Когда фильтры имеют одинаковый порядок, порядок определяется областью действия: применяется ли он к контроллеру или применяется к действию.
Фильтры области действия контроллера того же порядка запускаются до фильтров действия того же порядка.
Простой обходной путь - применить явный порядок в этом случае к атрибуту транзакции.
[Transaction(Order=1)]
public class TestController
{
public ActionResult Index()
{
return View();
}
[NoTransaction(Order=0)]
public ActionResult Test()
{
return View();
}
}
Это обеспечит выполнение NoTransaction до выполнения Transaction.
Если вы хотите, чтобы NoTransaction переопределял Transaction, проще всего сделать, чтобы NoTransaction добавил какой-то специальный ключ в HttpContext.Items, который считывает атрибут Transaction. Наличие этого ключа сообщит атрибуту Transaction ничего не делать.