c # Атрибуты и переопределение поведения asp.net mvc - PullRequest
2 голосов
/ 13 января 2010

У меня есть атрибут транзакции, который выполняет фиксацию в методе onactionexecuted.

Это указано в методе контроллера, для одного из моих действий мне нужно переопределить этот метод и не вызывать код в onactionexecuted?

Вот пример кода.

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

    [NoTransaction]
    public ActionResult Test()
    {
        return View();
    }
}

Атрибут [NoTransaction] должен переопределять метод onactionexecuted в [Transaction]. Есть ли способ сделать это?

Ответы [ 3 ]

4 голосов
/ 13 января 2010

Все фильтры действий имеют свойство заказа. Если он не определен, он имеет неявное значение -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 ничего не делать.

3 голосов
/ 13 января 2010

Если ваш NoTransactionAttribute является фильтром, вы можете установить флаг в его 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
    }
}
0 голосов
/ 13 января 2010

В OnActionExecuting атрибута NoTransaction можно поместить какой-нибудь флаг в HttpContext.Items, который затем можно будет проверить в OnActionExecuted атрибута Transaction. Или какой-то вариант этого.

HTHS
Charles

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...