2011-09-21 98 views
3

在測試期間(至少)我們記錄每個控制器/操作的一些底層信息。所有的控制器都來自我們自定義的BaseController,它覆蓋了OnActionExecuting來完成日誌記錄。MVC自定義操作屬性

我們在BaseController中有一個屬性,用於確定是否發生此日誌記錄,以便控制器可以重寫OnActionExecuting本身,重置該標誌,然後調用「base.OnActionExecuting」。例如,該標誌通常是正確的,但我們希望將其關閉以用於某些Json請求。

我們寧願做的是創建一個自定義的控制器/動作過濾器來處理,這樣的事情:

[LogPageAccess(false)] 
[HttpGet] 
Public ActionResult Foobar() 

我敢肯定有辦法做到這一點,但我沒有已經能夠弄清楚如何創建自定義屬性並讓它重置BaseController中的標誌。

謝謝...

在項目中,我使用

回答

2

以下驗證門禁控制器:

[Capability(UserCapability.FileManagement)] 
    public ActionResult FileList(FileListRequestModel request, bool ajax = false) 
    { 
     //code 
    } 

這裏是我的能力等級

/// <summary> 
/// Decorator to MVC class and method to evaluate if a certain capability is enabled 
/// </summary> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class CapabilityAttribute : AuthorizeAttribute 
{ 
    #region Class Attributes 

    private object _capability = null; 

    #endregion 

    #region Public Methods 

    /// <summary> 
    /// Create a new capability attribute 
    /// </summary> 
    /// <param name="capability">Context Value passed to the validator</param> 
    public CapabilityAttribute(object capability) 
    { 
     this._capability = capability; 
    } 

    /// <summary> 
    /// Check if attribute is enabled 
    /// </summary> 
    /// <param name="filterContext"></param> 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!Capability.Enabled(this._capability)) 
     { 
      throw new UnauthorizedAccessException(); 
     } 
     else 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 

    #endregion 
} 

你只需要適應這個代碼爲你的情況,我希望它變得有用

+0

需要類似的東西,這讓我需要去的地方。但是,我使用'filterContext.Result = new HttpUnauthorizedResult();'而不是拋出'UnauthorizedAccessException',這讓我覺得更適合MVC頁面。您可以查看[UnauthorizedAccessException]的MSDN文檔(http://msdn.microsoft.com/en-us/library/system.unauthorizedaccessexception.aspx)以瞭解爲什麼我不覺得它適合這種情況。 –

0

我試圖建立一個簡單的例子但是後來才意識到我無法將實例數據傳遞給Attribute - 所以如果我將Log標誌設置爲false,我不能使用它來直接操作基本控制器的屬性。

Check out this SO post

這是我打得周圍的代碼(不編譯 - 不能通過this):

public class BaseController : Controller 
{ 
    public bool LogPageRequests { get; set; } 
} 

public class LogPageAccess : ActionFilterAttribute 
{ 
    public LogPageAccess(BaseController baseController, bool log = true) 
    { 
     baseController.LogPageRequests = log; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //Do Whatever 
     base.OnActionExecuting(filterContext); 
    } 
} 

public class SomeController : BaseController 
{ 
    [LogPageAccess(this, false)] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

也許你可以做一些反思,但它可能的情況是,你」你必須按照你一直這樣做的方式來完成它,因爲它似乎不可能獲得實例數據到屬性。

+0

您可以從上下文中獲取控制器。 – SLaks

+0

@SLaks你能給我一個快速和骯髒的例子嗎? – davecoulter

+0

'filterContext.Controller' – SLaks