2010-01-12 40 views
2

我有一個事務屬性,在onactionexecuted方法中執行提交。c#屬性和重寫行爲asp.net mvc

這是在控制器方法中指定的,對於我需要重寫該方法而不調用onactionexecuted中的代碼的操作之一?

這是一些示例代碼。

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

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

[NoTransaction]屬性應該覆蓋[Transaction]中的onactionexecuted方法。 有沒有辦法做到這一點?

+1

請提供一些代碼來說明您的問題。 – 2010-01-12 23:52:26

回答

3

如果您的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

它吸引ActionDescriptor.IsDefined(typeof(Foo),true)實際上並沒有正確使用繼承。例如。 Controller具有[Authorize],該Action由Action繼承,但ActionDescriptor.IsDefined方法返回false。 – 2014-11-03 06:33:49

0

NoTransaction屬性的OnActionExecuting你可以把某種標誌的HttpContext.Items然後你可以在Transaction屬性的OnActionExecuted檢查。或者有些變化。

HTHS,
查爾斯

+0

[NoTransaction]是否先運行? – Schotime 2010-01-13 00:16:14

+0

我認爲這個命令是: 'Transaction.OnActionExecuting' - >'NoTransaction.OnActionExecuting' - >'NoTransaction.OnActionExecuted' - >'Transaction.OnActionExecuted' – Charlino 2010-01-13 00:20:31

4

所有行動過濾器有一個訂單財產。如果沒有定義,它的隱含值爲-1。當過濾器具有相同的順序時,順序由範圍決定:應用於控制器還是應用於某個操作。

相同順序的控制器作用域過濾器在相同順序的操作過濾器之前運行。

簡單的解決方法是將本例中的顯式排序應用於Transaction屬性。

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

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

這將確保NoTransaction在事務之前運行。

如果您希望NoTransaction覆蓋事務,最簡單的方法是讓NoTransaction在Transaction屬性讀取的HttpContext.Items中添加一些特殊鍵。這個鍵的存在會告訴Transaction屬性不做任何事情。